0

我正在编写一个应用程序,其中远程服务必须始终运行并执行这些任务:

  • 创建并保持与另一台设备的蓝牙连接
  • 定期向该设备询问信息(1 秒)
  • 定期获取 GPS 位置(1 秒)
  • 每 1 秒将以前的数据写入文本文件

为此,我从远程服务创建了 2 个线程:一个用于数据请求(loopThread),一个用于 GPS 位置(gpsThread)。loopThread 在从蓝牙设备获取数据后应该向 gpsThread 询问位置。它必须非常快,这就是我使用线程的原因,所以我可以将位置存储在可以发送的变量中。

远程服务和 2 个线程应该通过处理程序进行通信。

问题是:我可以让每个处理程序与远程服务通信,但不能相互通信。

我创建这样的线程:

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

我尝试通过消息将一个处理程序发送给另一个处理程序,但处理程序似乎不可打包。

有没有人可以解决这个问题?

4

1 回答 1

1

如果你想坚持你的Handler基础方法,你可以设置你的两个Threads 如下。

对于您Thread的 s,子类HandlerThread而不是 Thread。另外,让他们实施Handler.Callback,不要start()马上实施。

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;看这里

如前所述,您还可以设置两个Thread在两个LinkedBlockingQueue上运行的“普通” ;run()这些线程会在等待来自另一个线程的消息(又名对象)时阻塞它们的方法。

于 2013-04-15T09:22:51.160 回答