2013-03-04 69 views
0

我从时间去时间的AsyncTask更新测试我的应用程序错误:错误的观点

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连接到View上做一些事情,所以我不知道我为什么得到这个信息。

这是我的代码:

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(); 
     } 

回答

2

你不能从refresList方法中调用wordList.setAdapter(adapterCursor);。这是“从非UI线程更改视图”的一种方式。

因此,请保存adapterCursor实例并在onPostExecute方法内使用它。

+0

像往常一样,很好的答案。谢谢你Cristian。 – sebap123 2013-03-04 20:32:33

0

您无法在后台任务中操作您的视图。在AsyncTask中执行所有需要的加载,然后将其传递回onPostExecute中的活动,然后设置适配器。在后台任务或服务中执行任何形式的UI操作都会引发此错误。