我有一个工作线程位于后台,用于处理消息。像这样:
class Worker extends Thread {
public volatile Handler handler; // actually private, of course
public void run() {
Looper.prepare();
mHandler = new Handler() { // the Handler hooks up to the current Thread
public boolean handleMessage(Message msg) {
// ...
}
};
Looper.loop();
}
}
从主线程(UI线程,没关系),我想做这样的事情:
Worker worker = new Worker();
worker.start();
worker.handler.sendMessage(...);
麻烦在于,这使我处于良好的竞争状态:在worker.handler
读取时间时,无法确定工作线程是否已分配给该字段!
我不能简单地Handler
从Worker
的构造函数创建,因为该构造函数在主线程上运行,因此Handler
会将自身与错误的线程相关联。
这似乎并非罕见的情况。我可以提出几种解决方法,它们都很难看:
像这样:
class Worker extends Thread { public volatile Handler handler; // actually private, of course public void run() { Looper.prepare(); mHandler = new Handler() { // the Handler hooks up to the current Thread public boolean handleMessage(Message msg) { // ... } }; notifyAll(); // <- ADDED Looper.loop(); } }
从主线程:
Worker worker = new Worker(); worker.start(); worker.wait(); // <- ADDED worker.handler.sendMessage(...);
但这也不可靠:如果
notifyAll()
发生在之前wait()
,那么我们将永远不会被唤醒!将缩写传递
Message
给Worker
的构造函数,并让run()
方法发布它。临时解决方案不适用于多封邮件,或者如果我们不想立即发送,而是在不久之后发送。忙于等待,直到
handler
田野不再null
。是的,不得已...
我想创建Handler
和MessageQueue
代表Worker
线程,但这似乎是不可能的。最优雅的方法是什么?
HandlerThread
吗?