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ライブラリの驚異であり、この記事では説明しません。



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



All Articles