半分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のサンプルで何かやっていた。
@Overridepublic void onLeScan(final BluetoothDevice device, int rssi,byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Overridepublic void run() {mLeDeviceListAdapter.addDevice(device);mLeDeviceListAdapter.notifyDataSetChanged();}});}
このrunOnUiThreadってのがそれっぽいようだ。
が、同じようにしてみたけど、やはり怒られる。
うーむ。
あれだ、コンテキストが違うので、第1引数をthisってしてもだめなようだ。
getApplicationContext()とすると、エラーが消えた(参照:モバイル開発系(K))。
そうかそうか。
もう1つ。
コールバックの引数で文言を変えたい。
このときは、仮引数の宣言をfinalにするとよいようだ。
スタック渡しだからダメなんだろうと思っていたんだけど、Javaだから「まだ使います」って言っておけばよいということなのかね。
これでようやく、BLEの検索結果を戻せるところまで来た。
https://github.com/hirokuma/BleTest
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。