Androidでengine.io
前回やったengine.ioの記事にも書いてるが、Java向けのクライアントライブラリが既にengine.io-client-javaっていうのがあるので、それを使えば出来るだろうってことでやってみた
※サーバーは前回のをそのまま利用
MainActivity.java
まぁ詳しいことは公式のリファレンスなり読むなりでやればいいんだけど
package sample.test;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.ArrayAdapter;
import com.github.nkzawa.emitter.Emitter;
import com.github.nkzawa.engineio.client.Socket;
import com.github.nkzawa.engineio.client.transports.WebSocket;
public class MainActivity extends ListActivity {
private Handler mHandler = new Handler();
private ArrayAdapter<String> mAdapter;
private Socket socket;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
mAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
setListAdapter(mAdapter);
}
@Override
protected void onStart() {
super.onStart();
Socket.Options options = new Socket.Options();
options.hostname = "[IP Address]";
options.port = 80;
options.transports = new String[] { WebSocket.NAME };
socket = new Socket(options);
socket.on(Socket.EVENT_OPEN, new Emitter.Listener() {
@Override
public void call(Object... args) {
Log.v(TAG, "open");
}
});
socket.on(Socket.EVENT_MESSAGE, new Emitter.Listener() {
@Override
public void call(Object... args) {
final String data = (String)args[0];
mHandler.post(new Thread() {
@Override
public void run() {
mAdapter.add("message: " + data);
}
});
}
});
socket.open();
}
@Override
protected void onStop() {
super.onStop();
Log.v(TAG, "onStop");
if (socket != null) {
socket.close();
socket = null;
}
}
}
非常にざっくりとしているけど。ちょっと前に検証したのを再度検証でやってみたけど、Socketのインスタンスでのonopenなどのメソッドをオーバーライドするような方式がなくなってる模様げ。そこら辺はEmitter.Listenerを使うことで出来る模様
とまぁ公式ドキュメント読むなりすれば特記事項もなさそうな気がするので、とりあえずこんなもんでってことで
とりあえずはAndroidでengine.io使う場合とかであれば採用するのもありなんじゃないかかって事で終わり
追記
callメソッドの引数の型はサーバー側で送信されるデータにおいて
- Stringのような文字列を指定している場合は引数はjava.lang.String型
- Bufferのようなtyped arrayで指定している場合には引数はbyte[]
っていうように変わってくる模様