我正在编写一个应用程序,其中必须始终运行远程服务并执行这些操作:
为此,我从我的远程服务2 Threads创建:一个用于数据请求(loopThread),另一个用于GPS位置(gpsThread)。从蓝牙设备获取数据后,loopThread应该向gpsThread询问该位置。它必须非常快,这就是我使用Thread的原因,所以我可以将Location存储在一个可以发送的变量中。
远程服务和2个线程应通过处理程序进行通信。
问题是:我可以让每个处理程序与远程服务进行通信,但不能相互通信。
我创建这样的线程:
myGPSThread = new GPSThread(mainServiceHandler,locationManager);
myLoopThread = new AcquisitionThread(mainServiceHandler, sockIn, sockOut);
我尝试通过消息将一个处理程序发送到另一个,但处理程序似乎不是可以分配的。
有没有人能解决这个问题?
答案 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()
方法。