0

アプリのエラーを時々テストしています:

03-04 20:57:01.929: E/TestApp(13673): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

このような質問から: Whats this exception? 、そして私自身の経験(前述の質問と同じエラーが時々発生しました)それを取り除くために何ができるかお聞きしたいと思いますか?

私の知る限り、ビューに接続された AsyncTask でいくつかのことを実行できるので、なぜこの情報を取得しているのかわかりません。

これは私のコードです:

private MyDBAdapter mySQLiteAdapter;
    private ListView wordList;
private AsyncDBDownload asycn;
    private ProgressDialog dbUpdate;

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.smart_guide_ocr);

            asycn = new AsyncDBDownload();

            wordList = (ListView) findViewById(R.id.wordsList);
    //...
    }

    @Override
        protected void onResume() {
            super.onResume();
            asycn.execute(null);
        }

    private class AsyncDBDownload extends AsyncTask<String, Integer, String> {

            @Override
            protected String doInBackground(String... params) {
                try {
                    refreshList();//upload of contetn and set of adapter
                } catch (Exception ex) {
                    Log.e(TAG, ex.toString());
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                dbUpdate.dismiss();
            }

            @Override
            protected void onPreExecute() {
                dbUpdate = ProgressDialog.show(TestAppActivity.this, "Wait",
                        "DB download");
            }
        }

    private void refreshList() {
            mySQLiteAdapter = new MyDBAdapter(TestAppActivity.this);
            mySQLiteAdapter.open();
            String[] columns = { MyDBAdapter.KEY_TRANSLATED, MyDBAdapter.KEY_WORD, MyDBAdapter.KEY_LANG,
                    MyDBAdapter.KEY_ID };
            Cursor contentRead = mySQLiteAdapter.getAllEntries(false, columns,
                    null, null, null, null, MyDBAdapter.KEY_ID, null);
            startManagingCursor(contentRead);
            Log.d(TAG, Integer.toString(contentRead.getCount()));
            RowItem adapterCursor = new RowItem(this, R.layout.save_word_row,
                    contentRead, columns, new int[] { R.id.translatedWord, R.id.orgWord, R.id.langInfo }, 0);

            wordList.setAdapter(adapterCursor);
            mySQLiteAdapter.close();
        }
4

2 に答える 2

2

メソッドwordList.setAdapter(adapterCursor);内から呼び出してはいけません。refresListこれは、「非 UI スレッドからビューを変更する」方法です。

したがって、代わりに、adapterCursor インスタンスを保存し、onPostExecute メソッド内から使用します。

于 2013-03-04T20:15:01.397 に答える
0

バックグラウンド タスク内でビューを操作することはできません。AsyncTask で必要なすべての読み込みを行い、それを onPostExecute のアクティビティに戻してから、アダプターを設定します。バックグラウンド タスクまたはサービスで任意の形式の UI 操作を行うと、このエラーがスローされます。

于 2013-03-04T20:15:50.307 に答える