如何从分离的线程初始化处理程序?

时间:2013-04-15 08:19:21

标签: android handler

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

  • 创建并保持与其他设备的蓝牙连接
  • 定期询问此设备的信息(1秒)
  • 定期获取GPS位置(1秒)
  • 每1秒在文本文件中写入以前的数据

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

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

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

我创建这样的线程:

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

我尝试通过消息将一个处理程序发送到另一个,但处理程序似乎不是可以分配的。

有没有人能解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您想坚持基于Handler的方法,可以按如下方式设置两个Thread

对于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;见here

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