sendBroadcast无法从WorkerThread工作

时间:2013-04-05 14:27:29

标签: java android android-intent handler

我想使用以下方法从FromTowerThread发送广播:

void postToService(final String string){
        Handler handler = new Handler();
        handler.post(new Runnable(){
             @Override
             public void run() {
                 context.sendBroadcast(new Intent(string));
             }
        });
    }

我的上下文是'this'(我的服务):

FromTowerThread ftt = new FromTowerThread(this);

(只是为了完整性我在FromTowerThread中的构造函数):

public FromTowerThread(Context context){
      this.context=context;
    }

我得到的错误是“无法在未调用Looper.prepare()的线程内创建处理程序”。

我不知道如何修复此错误,我发现有关此主题的所有主题都无法帮助我理解这一点。

提前致谢!

克里斯

3 个答案:

答案 0 :(得分:0)

  

我得到的错误是“无法在未调用Looper.prepare()的线程内创建处理程序”。

如果要扩展Thread,请尝试扩展HandlerThread。 HandlerThread已经有一个Looper。 (或者您可以在常规线程中自己调用Looper.prepare()Looper.loop()。)

否则你可以做一些事情来使用主线程的Looper。例如,在主线程中创建Handler并将其传递给您的工作线程,或者甚至从UI线程传递一个View并调用view.post(Runnable)以在UI线程上执行该Runnable。

答案 1 :(得分:0)

Post只能在一个名为Looper.prepare()的线程中的Handler中完成。

我在这里假设调用void postToService(final String string)的线程是某种类型的后台线程。通常UI线程会调用Looper.prepare(),这意味着您必须在UI线程内创建Handler。

但是作为一般性建议,我很确定你可以消除所有这些并立即拨打广播:

void postToService(final String string){
      context.sendBroadcast(new Intent(string));
}

答案 2 :(得分:0)

更改声明

Handler handler = new Handler(); 

Handler handler = new Handler(Looper.getMainLooper());