Android Loopers :Unable to get messages from UIThread to worker thread

标签 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)));
    }

工作线程:

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/

相关文章:

android - 窗口甚至在 dialog.dismiss() 上泄漏

java - Android/java - 在 onClick 中使用计时器循环

Android 支持库 appcompat v7 : cannot find actionModeShareDrawable resource

android - 如何实现 Material 指南中描述的全屏对话框?

android - android 有垃圾收集功能吗?它有多快?

android - APK 安装失败。错误 : Could not parse error string

Android - fill_parent 在relativelayout 中的行为不符合预期

android - View类中context.getTheme.obtainStyledAttributes和context.obtainStyledAttributes的区别

android - Android中的MediaCodec是否支持音频编码器?

android - 如何在摩托罗拉里程碑,android中获取屏幕宽度和高度