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.

从这样的问题:这是什么异常?,以及我自己的经验(我不时遇到与提到的问题相同的错误)我想问你们我能做些什么来摆脱它?

据我所知,我可以在连接到 View 的 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 回答