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)));
}
WORKER THREAD:
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
。那是为什么?
答案 0 :(得分:1)
在此代码中:
WorkerThread wt = new WorkerThread();
workerHandler = wt.getHandler();
wt.start();
第1行实例化一个新的WorkerThread
对象并调用其构造函数。 注意:这实际上并不会创建正在运行的线程,也不会调用run()
方法
第2行调用getHandler()
对象上的WorkerThread
并返回从未设置为任何内容的成员变量workerHandler
,因此它是null
第3行启动线程。
问题是线程中的run()
方法在执行第3行之后才被调用。
请查看Android提供的HandlerThread
。它几乎与此相同。搜索教程或示例以了解如何使用它。例如:http://stephendnicholas.com/archives/42