2011-10-08 77 views
0

我的應用程序使用CallLog來收集數據並將其放入列表視圖中。由於這需要時間,我嘗試使用progressdialog向用戶顯示加載的狀態。不幸的是(之前我用過progressdialog)eclipse拋出一個錯誤:ERROR/AndroidRuntime(771):android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖。Android progressdialog線程異常

public class Calls extends Activity { 
    //declaring variables 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.calls); 

       lv1 = (ListView) findViewById(R.id.ListView01); 

       pd = new ProgressDialog(Calls.this); 
       pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
       pd.setMessage("Loading contacts"); 
       pd.show(); 

       //Thread thread = new Thread() { 
       //public void run() { 
       Calls.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 

     //collecting data from CallLog, putting data into an array 
    //Here comes the hard part, which is the root of the problem: 


     final ArrayList<SearchResults> results = new ArrayList<SearchResults>(); 
      SearchResults sr1 = new SearchResults(); 

      for (int b=0; b<storage.length; b++) 
      { 
       for (int e=0; e<storage[b].length; e++) 
       { 
        if (e+3 < storage[b].length) 
        { 
         arr_split_all.add(storage[b][e] + " " + storage[b][e+1] + " " + storage[b][e+2] + " " + storage[b][e+3]); 
         sr1 = new SearchResults(); 
         sr1.setData1(storage[b][e+2]); 
         sr1.setData2(storage[b][e]); 
         sr1.setData3(storage[b][e+1]); 
         sr1.setData4(storage[b][e+3]); 
         sr1.setBitmap2(bitmaparray[b]); //bitmaparray has the same size as storage, and there is no problem with this 
         results.add(sr1); 
        } 
       } 
      } 


      lv1.setAdapter(new MyCustomBaseAdapter(Calls.this, results)); //problematic row 
      handler.sendEmptyMessage(0); 
      } 
      }; 
      thread.start(); 
      } 
    }//end of onCreate  

    private Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      pd.dismiss(); 
     } 
    }); //ADDED a) 


    }//end of class 
    // SearchResults is another class: 

      public class SearchResults extends Application{ 
      private String data1 = ""; 
      private String data2 = ""; 
      private String data3 = ""; 
      private String data4 = ""; 
      private String bitmap = ""; 
      private Bitmap bitmap2; 


      public void setData1(String data1) { 
       this.data1 = data1; 
      } 

      public String getData1() { 
       return data1; 
      } 

      //etc... 
      } 

,我使用一個BaseAdapter類來把數據放到列表視圖(其中包括一個imageview的四個textviews的)的合適的地方,但我不認爲現在是相關的。

根據Logcat,問題是與lv1.setAdapter(new MyCustomBaseAdapter(Calls.this, results));行。如果我將一個數組列表附加到列表視圖,它工作正常。如果沒有progressdialog,則所有textview和listview每一行的imageview都會正確加載。

回答

0

問題是您的findViewById()致電您的ListView01(以及稍後調用setAdapter())。您不能從自定義線程修改(或訪問)視圖。這必須在UI線程上完成,通過runOnUiThread()或在UI線程運行的地方完成。