2013-03-04 70 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操作都會引發此錯誤。