0

リモートサービスに接続するモジュールを作成したい。

このモジュールは、開発者がアプリで特定の(Bluetooth-)ハードウェアに接続するために使用できます。次に、市場で個別に更新できる単一のリモートサービスに接続する必要があります。

リモートサービスは、同時に使用するすべてのアプリに対して単一のスレッドしか許可されていないため(Bluetooth経由の接続は1つのみ)、AIDLではなくメッセンジャーアプローチを選択しました。

私の問題は、パブリックAPIで同期メソッドを提供したかったのですが、サービスがハンドラーで返されることです。私が理解している限り、ハンドラーは常に現在のタスクが終了するのを待ちます...別のスレッドで答えを得る方法は?

私が望む同期メソッドのコード:

responseDataSync = new Sync<ResponseData>();

    // Send message
    Message msg = Message.obtain(null, Constants.DATA, 1, 0);

    send(msg);

    try {
        ResponseData responseData = responseDataSync.get();

        // with responseDataSync using a countdown latch to synchronize...
// but it never fires thanks to the handler.
//etc...

前もって感謝します。私の質問がある程度理解できたと思います...;)

/ EDIT:サーバーからデータを返すメソッドが必要です。お気に入り

 public ResponseData returnResponse(Data dataToSend)

しかし、ハンドラーが戻るのを妨げるスレッドでスタックしているため、サービスが戻るのを待つことができません...

4

1 に答える 1

3

AHandlerは単一のメッセージキューに関連付けられています。スレッドからを送信するMessageと、そこにエンキューされます。

すべてのメッセージを受信するスレッドは、適切なメッセージをキューから取得し、それを1つずつ処理します。

つまり、ハンドラーがあり、ハンドラーを介してすべてのメッセージを実行する場合、すべてが単一のスレッドで処理されるため、同期は必要ありません。

編集:バックグラウンドスレッドでメッセージを処理するハンドラーを作成するには:

HandlerThread ht = new HandlerThread("threadName");
ht.start();
Looper looper = ht.getLooper();
Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        // handled messages are handled in background thread 
        return true;
    }
};
Handler handler = new Handler(looper, callback);

handler.sendEmptyMessage(1337);

Edit2:メッセージを待つとこのように機能する可能性があります

// available for all threads somehow
final Object waitOnMe = new Object();

HandlerThread ht = new HandlerThread("threadName");
ht.start();
Looper looper = ht.getLooper();
Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {
        // handled messages are handled in background thread
        // then notify about finished message.
        synchronized (waitOnMe) {
            waitOnMe.notifyAll();
        }
        return true;
    }
};
Handler handler = new Handler(looper, callback);

// in a different Thread:
synchronized (waitOnMe) {
    handler.sendEmptyMessage(1337);
    try {
        waitOnMe.wait();
    } catch (InterruptedException e) {
        // we should have gotten our answer now.
    }
}
于 2012-04-20T09:46:30.393 に答える