最も重要なことは、プログラムがサーバーに接続して動作するために必要な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ライブラリの驚異であり、この記事では説明しません。
それだけです。 質問やコメントがあれば、書いて、一緒に理解します。