0

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

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

我的上下文是“这个”(我的服务):

FromTowerThread ftt = new FromTowerThread(this);

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

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

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

我不知道如何解决这个错误,我发现的关于这个主题的所有线程都无法帮助我理解这一点。

提前致谢!

克里斯

4

3 回答 3

0

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

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

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

于 2013-04-05T14:35:04.820 回答
0

Post 只能从调用 Looper.prepare() 的线程中的 Handler 完成。

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

但作为一般建议,我很确定您可以消除所有这些并立即调用广播:

void postToService(final String string){
      context.sendBroadcast(new Intent(string));
}
于 2013-04-05T14:35:14.103 回答
0

更改声明

Handler handler = new Handler(); 

Handler handler = new Handler(Looper.getMainLooper());
于 2013-04-05T14:42:59.393 回答