AndroidからSignalRを操作する

そのため、多くの苦労の末、最終的にAndroidのSignal Rライブラリにあるすべての機能(作業に必要な機能)を把握することができました。

最も重要なことは、プログラムがサーバーに接続して動作するために必要なjarファイルです。
これらは私のサイトからダウンロードできますが、 Githubから作成することもできます:
http://smartarmenia.com/android_libs/signalr-client-sdk.jar
http://smartarmenia.com/android_libs/signalr-client-sdk-android.jar

また、Android StudioのMaven依存関係から追加できる、またはEclipse for googleからダウンロードできるgsonライブラリも必要です。

したがって、これらのライブラリをプロジェクトのlibsフォルダーに追加した後、サーバーに既に接続できます。

私の例では、サービスとAsyncTaskのすべて、それをどのように、どこで行うかを自分で決めます。

最初に行うことは、Androidでsignalrの使用を開始する前に静的メソッドを呼び出すことです。

Platform.loadPlatformComponent(new AndroidPlatformComponent()); 


次に、接続とハブを作成します。

 HubConnection connection = new HubConnection("signalr_host"); HubProxy mainHubProxy = connection.createHubProxy("MainHub"); 


その後、接続を制御するためにstate_changeイベントをキャッチする必要があります。

 connection.stateChanged(new StateChangedCallback() { @Override public void stateChanged(ConnectionState connectionState, ConnectionState connectionState2) { Log.i("SignalR", connectionState.name() + "->" + connectionState2.name()); } }); 

これは、状態を変更するためのものです(切断、接続、接続、再接続)

次に、切断イベントをキャッチします。

 connection.closed(new Runnable() { @Override public void run() { Log.i("SignalR", "Closed"); connectSignalr(); } }); 


AsyncTask接続を呼び出す関数(この関数は、サービスの開始時に切断(閉じる)で呼び出す必要があります):

 private void connectSignalr() { try { SignalRConnectTask signalRConnectTask = new SignalRConnectTask(); signalRConnectTask.execute(connection); } catch (Exception ex) { ex.printStackTrace(); } } 


SignalRConnectTaskクラスコード:

 public class SignalRConnectTask extends AsyncTask { @Override protected Object doInBackground(Object[] objects) { HubConnection connection = (HubConnection) objects[0]; try { Thread.sleep(2000); connection.start().get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return null; } } 


サーバーへの接続は既に機能しています。 将来、イベントをサブスクライブするか、ハブ関数を呼び出す必要があります。

購読する

 mainHubProxy.subscribe("newClient").addReceivedHandler(new Action<JsonElement[]>() { @Override public void run(JsonElement[] jsonElements) throws Exception { Log.i("SignalR", "Message From Server: " + jsonElements[0].getAsString()); } }); 


jsonElements配列(サーバーから送信されたデータ)では、シリアル化可能な任意の型を使用できます。 基本的に、私たちはそれらがどんな型であるかを知っており、望ましい型に変換できます。 自分でやりますが、質問がある場合や例が必要な場合は、コメントに書いてください。

呼び出す

これは、ハブメソッドを呼び出すためのものです。 結果を返し、何も返さないメソッド(Void)の2つのオプションがあります。

まず、Voidを見てみましょう。

 public class SignalRTestActionTask extends AsyncTask { @Override protected Object doInBackground(Object[] objects) { if (connection.getState() == ConnectionState.Connected) { Object param1 = objects[0]; Object param2 = objects[1]; try { mainHubProxy.invoke("TestMethod", param1, param2).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); } } new SignalRTestActionTask().execute(new Object(), new Object()); 


繰り返しますが、タスクを完了するためにAsyncTaskを作成します。

次に、他のinvokeバリアントに対して同じことを行い、結果を返します。

 public class SignalRTestActionWithResultTask extends AsyncTask { @Override protected Object doInBackground(Object[] objects) { if (connection.getState() == ConnectionState.Connected) { Object result = null; Object param1 = objects[0]; Object param2 = objects[1]; try { result = mainHubProxy.invoke(Object.class, "TestMethod", param1, param2).get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } return result; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); //    . } } new SignalRTestActionWithResultTask().execute(new Object(), new Object()); 


すべてがシンプルです。

次に、jsonをクラスにデシリアライズします。

たとえば、signalrのメソッドはStringを返しますが、それはわかっています。
これを行うには、invoke関数にメソッドの結果の型を渡し、gsonを使用した結果でデータを目的の型に変換します。

 String result = mainHubProxy.invoke(String.class, "TestMethod", param1, param2).get(); 


json配列が到着すると、次のように型が配列に渡されます。

 String[] result = mainHubProxy.invoke(String[].class, "TestMethod", param1, param2).get(); 


さて、配列はリストに簡単に変換できます。

 List<String> strings = Arrays.asList(result); 


戻り値の型として、任意のシリアル化可能な型を指定できます。たとえば、オブジェクトのjson構造を使用して独自のクラスを作成できます。 しかし、これらはgsonライブラリの驚異であり、この記事では説明しません。

それだけです。 質問やコメントがあれば、書いて、一緒に理解します。

Source: https://habr.com/ru/post/J301752/


All Articles