Android Loopers:无法从UIThread获取消息到工作线程

时间:2013-02-20 20:20:43

标签: android

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。那是为什么?

1 个答案:

答案 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