2013/11/24

[java]コールバックしてToastを出したい

半分Java、半分Androidだ。

まず、コールバックしたい。
こちらはJavaだ。

コールバックする側interfaceを作っておき、コールバックしてほしい人はそのインスタンスを作り、中身を作っておく。
そしてコールバックする側に渡す。
コールバックする側は、そのメソッドを呼ぶだけ。

 

// コールバックする側がinterfaceを作っておき、
public interface callback {
    public void onResult(int result);
}

--------------

    //コールバックしてほしい人はそのインスタンスを作り、
    //中身を作っておく
    private xxClass.callback mCallback = new xxx.callback() {
        @Override
        public void onResult(int result) {
            Log.d(TAG, "callbacked");
        }
    };

//そしてコールバックする側に渡す
{
    xxClass xx = new xxClass();
    xx.function(mCallback);
}

--------------

//コールバックする側は、そのメソッドを呼ぶだけ
void function(callback cb) {
  cb.onResult(0);
}

--------------

interfaceじゃなくてabstractってのでやろうとしたけど、なんかダメだった。
気が向いたらちゃんと調べよう。


コールバックした先でToastを表示したい。
こっちはAndroidだ。

やったんだけど、コンテキストが違うせいか、コンパイルで怒られた。

The method makeText(Context, CharSequence, int) in the type Toast is not applicable for the arguments (new BleUtils.scanResultCallback(){}, String, int)

BleUtils.scanResultCallbackは、上でいうところのxxClass.callbackだ。
Log.d()は使えたんだけど、Toastはだめだって。
まあ、画面に何か出すんだから、UIコンテキストじゃないとダメなのかな(追求してない)。

これは確か、BLEのサンプルで何かやっていた。

    @Override
    public void onLeScan(final BluetoothDevice device, int rssi,
            byte[] scanRecord) {
      runOnUiThread(new Runnable() {
        @Override
        public void run() {
          mLeDeviceListAdapter.addDevice(device);
          mLeDeviceListAdapter.notifyDataSetChanged();
        }
      });
    }

このrunOnUiThreadってのがそれっぽいようだ。
が、同じようにしてみたけど、やはり怒られる。
うーむ。

あれだ、コンテキストが違うので、第1引数をthisってしてもだめなようだ。
getApplicationContext()とすると、エラーが消えた(参照:モバイル開発系(K))。
そうかそうか。

もう1つ。
コールバックの引数で文言を変えたい。
このときは、仮引数の宣言をfinalにするとよいようだ。
スタック渡しだからダメなんだろうと思っていたんだけど、Javaだから「まだ使います」って言っておけばよいということなのかね。

 

これでようやく、BLEの検索結果を戻せるところまで来た。
https://github.com/hirokuma/BleTest

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。