【问题标题】:handleMessage Only the original thread that created a view hierarchy can touch its viewshandleMessage 只有创建视图层次结构的原始线程才能接触其视图
【发布时间】:2017-04-28 13:00:04
【问题描述】:

我无法重现此问题,但我收到了一些错误报告

异常 android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能接触其视图。

样本

 SampleActivity extends Activity{
   private Messenger callBackMessenger = new Messenger(new CallBackHandler(this));
 }

  private static class CallBackHandler extends Handler {
    public CallBackHandler(SampleActivity activity) {
          context = new WeakReference<>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
      TestActivity a = context.get();
      if(a!=null){
      a.textView.setText("text"); <<crash 
    }
}

来自 onStart 和 onStop 的绑定和取消绑定调用

handleMessage 应该在 UI 中处理(如果在 UI 中创建)。我想纠正错误行为的原因。 runOnUiThread 是解决方法。

【问题讨论】:

  • 发布您的相关代码。需要更多信息以了解问题所在
  • @Raghunandan 我不明白为什么 handleMessage(在 UI-Th 中创建的处理程序)在非 UI 线程中处理。抱歉,我无法输入所有代码。
  • 查看代码并没有提示我们在 ui 线程或后台线程上运行的内容。抱歉,我无法提供更多帮助

标签: android multithreading


【解决方案1】:

把a.uodateUI放到runOnUiThread中

公共 CallBackHandler(TestActivity 活动) { context = new WeakReference(activity); }

    @Override
    public void handleMessage(Message msg) { 

      TestActivity a = context.get();
      if(a!=null){
      a.runOnUiThread(new Runnable () {
      public void run() {
      a.updateUI(); <<crash
     } 
    }) ; 
    }
}

【讨论】:

  • 不想。 handleMessage 应该在 UI 中处理。我想纠正错误行为的原因。 runOnUiThread 是一种解决方法。
  • 不,它在后台运行,无法在后台更新UI。
  • 它在后台运行,但应该在 UI 中
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多