private Handler workerHandler; // instance variable of UIThread
在 onCreate() 方法中
WorkerThread wt = new WorkerThread();
workerHandler = wt.getHandler();
wt.start();
使用下面的 SeekBar 监听器方法将消息发送到 WorkerThread 的队列
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
tv.setText(String.valueOf(progress));
workerHandler.sendMessage(workerHandler.obtainMessage(99,String.valueOf(progress)));
}
工作线程:
private Handler handler;
//getHandler() method
public void run() {
super.run();
Looper.prepare();
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 99)
Log.d("RTR","Message from Main Thread:"+(String)msg.obj);
}
};
Looper.loop();
但是当我更改 SeekBar
时,出现“程序不幸停止”消息。可能是什么原因?
更新:问题出在工作线程 workerHandler
的处理程序上。它仍然是 null
。这是为什么?
最佳答案
在这段代码中:
WorkerThread wt = new WorkerThread();
workerHandler = wt.getHandler();
wt.start();
第 1 行实例化一个新的 WorkerThread
对象并调用其构造函数。 注意:这实际上并没有创建一个正在运行的线程,也没有调用run()
方法
第 2 行在 WorkerThread
对象上调用 getHandler()
并返回成员变量 workerHandler
,它从未被设置为任何东西,所以它是 null
第 3 行启动线程。
问题是线程中的 run()
方法直到 第 3 行执行后才被调用。
请看一下Android提供的HandlerThread
。它几乎和这个做同样的事情。搜索教程或示例以了解如何使用它。例如:http://stephendnicholas.com/archives/42
关于Android Loopers :Unable to get messages from UIThread to worker thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14989158/