0

私はListActivitySMSを持っていContentObserverます。ListViewに送受信された SMS が表示されます。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 に答える