我有一个带有SMS ContentObserver
的ListActivity
。ListView
显示发送/接收短信。每当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
在主线程的活套上运行,因为您正在主线程中创建观察者。