Androidでengine.io

2014-05-21T00:00:00+00:00 Android Java

前回やった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[]

っていうように変わってくる模様

ScalaTest engine.io