CalledFromWrongThreadException: Android ContentObserver and



我有一个带有SMS ContentObserverListActivityListView显示发送/接收短信。每当SMS数据库(发送/接收)发生变化时,观察者调用CCD_ 4内的更新CCD_。

这在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);
    }
}

不能简单地从另一个线程(即ContentObserver线程)调用updateList();。相反,你最好像一样用runOnUiThread();包裹它

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

您可以创建通过的ContentObserver

new Handler()

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

最新更新