0

我有ListActivity一条短信ContentObserver。显示ListViewSMS 发送/接收。每当 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);
    }
}
4

2 回答 2

3

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

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        updateList();
    }
});
于 2012-09-03T15:25:58.777 回答
1

你可以创建ContentObserver传球

new Handler()

This will make the onChange running on the looper of the main thread since you are creating the observer in the main thread.

于 2014-01-27T12:36:11.137 回答