【问题标题】:CalledFromWrongThreadException: Android ContentObserver and Activity interfaceCalledFromWrongThreadException:Android ContentObserver 和 Activity 接口
【发布时间】:2012-09-03 15:10:52
【问题描述】:

我有一个ListActivity 和一个短信ContentObserverListView 显示 发送/接收短信。 每当 SMS 数据库(发送/接收)发生变化时,观察者 在Activity 中调用一个函数,该函数会更新ListView

这在 FROYO 中工作正常。但在 ICS 中,我得到以下信息

android.view.ViewRootImpl$CalledFromWrongThreadException: 只有 创建视图层次结构的原始线程可以触及其视图。

请告诉我可能是什么问题。

以下是顶层代码。

public class MyList extends ListActivity implements OnInitListener{
    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyList.this.getContentResolver()
            .unregisterContentObserver(smsObserver);
    }

    @Override
    protected void onPause() {
        super.onPause();
        MyList.this.getContentResolver()
            .unregisterContentObserver(smsObserver); 
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.MyList );

        registerSmsEventObserver();
        updateList();
    }

    @Override
    protected void onResume() {
        super.onResume();
        registerSmsEventObserver();
    }

    updateList() {
        //fill up the listview
    }

    private void registerSmsEventObserver() {      
        if (smsObserver != null)
            return; 

        smsObserver = new ContentObserver(null) {             
            public void onChange(boolean selfChange) {   
                updateList();
            }
        };
        MyList.this.getContentResolver().registerContentObserver(
            Uri.parse("content://sms"), true, smsObserver);
    }
}

【问题讨论】:

  • 我告诉你,你不能从观察者内部触摸列表视图。请同时发送观察者调用的函数(updateList()

标签: android view sms listactivity contentobserver


【解决方案1】:

不只是从另一个线程调用updateList();,即ContentObserver 线程。相反,你最好用runOnUiThread(); 包裹它

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        updateList();
    }
});

【讨论】:

    【解决方案2】:

    你可以创建ContentObserver 传递

    new Handler()
    

    这将使onChange 在主线程的looper 上运行,因为您正在主线程中创建观察者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 2018-02-05
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多