0

リモートサービスを常に実行し、これらのタスクを実行する必要があるアプリケーションをコーディングしています:

  • 別のデバイスへの Bluetooth 接続を作成して維持する
  • このデバイスに定期的に情報を要求する (1 秒)
  • 定期的に GPS 位置情報を取得します (1 秒)
  • 前のデータを 1 秒ごとにテキスト ファイルに書き込む

このために、リモート サービスから 2 つのスレッドを作成しました。1 つはデータ要求用 (loopThread) で、もう 1 つは GPS 位置情報 (gpsThread) 用です。loopThread は、blueTooth デバイスからデータを取得した後、gpsThread に場所を問い合わせる必要があります。それは非常に速くなければならないので、私はスレッドを使用しているので、場所を変数に保存して送信することができます。

リモート サービスと 2 つのスレッドは、ハンドラを介して通信する必要があります。

問題は、各ハンドラーをリモート サービスと通信させることはできますが、相互に通信させることはできません。

私はこのようなスレッドを作成します:

myGPSThread = new GPSThread(mainServiceHandler,locationManager);
myLoopThread = new AcquisitionThread(mainServiceHandler, sockIn, sockOut);

メッセージで一方のハンドラーを他方に送信しようとしましたが、ハンドラーはパーセル可能ではないようです。

誰もこれに対する解決策を持っていますか?

4

1 に答える 1

1

ベースのアプローチに固執したい場合は、次のように 2 つの s をHandler設定できます。Thread

sでは、Thread の代わりにHandlerThreadThreadをサブクラス化します。また、それらを実装させ、すぐに実装させないでください。Handler.Callbackstart()

final class GPSThread extends HandlerThread implements Handler.Callback {
    private Handler otherThreadHandler;
    public void setOtherThreadHandler(Handler otherThreadHandler) {
        this.otherThreadHandler = otherThreadHandler;
    }
    @Override
    public void handleMessage(Message msg) {
        // like in your comment
    }

}

myGPSThread  = new GPSThread(locationManager);
myLoopThread = new AcquisitionThread(sockIn, sockOut);
myGPSThreadHandler  = new Handler(myGPSThread.getLooper(), myGPSThread);
myLoopThreadHandler = new Handler(myLoopThread.getLooper(), myLoopThread);
myGPSThread.setOtherThreadHandler(myLoopThreadHandler);
myLoopThread.setOtherThreadHandler(myGPSThreadHanlder);
myGPSThread.start();
myLoopThread.start();

待ち時間を短くしたいが、イベント ドリブン コードが短くて使いやすい場合は、HandlerThreadデフォルトよりも優先度の高い s を作成することをお勧めします。ここを参照してください。

すでに述べたように、2 つのLinkedBlockingQueueThreadで動作する 2つの「通常の」 をセットアップすることもできます。これらのスレッドは、他のスレッドからのメッセージ (別名オブジェクト) を待機すると、メソッドでブロックされます。run()

于 2013-04-15T09:22:51.160 に答える