我有一个工作线程,它位于后台,处理消息.像这样的东西:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
从主线程(UI线程,不重要)我想做这样的事情:
Worker worker = new Worker();
worker.start();
worker.handler.sendMessage(...);
Run Code Online (Sandbox Code Playgroud)
麻烦的是,这为我设定了一个漂亮的竞争条件:在worker.handler阅读时,没有办法确定工作线程已经分配给了这个领域!
我不能简单地Handler从Worker构造函数创建,因为构造函数在主线程上运行,因此Handler它将自己与错误的线程相关联.
这似乎不太常见.我可以提出几个解决方法,所有这些都是丑陋的:
像这样的东西:
class Worker extends Thread {
public volatile Handler handler; // actually private, of course …Run Code Online (Sandbox Code Playgroud)