2011年11月13日 星期日

AsyncTask & notifyDataChanged

adapter 的notifyDataChanged()必須在UI thread 中呼叫, 如果不是, 例如, 如果在adapter中, 自行呼叫 notifyDataChanged() 將會造成許多問題, 例如, 按鍵無法接受。在我的個案中,按鍵無法接受,不管是長按或是短按,但是,滑動光學滑鼠之後,就正常了,查網,的確有這個問題。
http://stackoverflow.com/questions/4566101/how-to-fix-notifydatasetchanged-listview-problems-in-dynamic-adapter-wrapper-and

解決的方法是使用AsyncTask, 例如:
 class AppendTask extends AsyncTask<Integer, Float, Exception> {
    @Override
    protected void onPreExecute() {
    ... run in UI thread
 
 
 return float-value; 
    }
    @Override
    protected Exception doInBackground(Integer... params) {
    ...
    ... run in WORKING thread
    ...publishProgress(a,b,c);
    }
 
 @Override
     protected void onProgressUpdate(Float progress) {
     ...run in UI thread
     }
    @Override
    protected void onPostExecute(Exception e) {
     ... run in UI thread
  }
  AsyncTask 的三個參數中,第一個參數(Integer), 是doInBackground()的輸入參數類別,是不定個數的參數。第二個參數(Float) 是onProgressUpdate的輸入參數類別,也是不定個數。第三個參數(如例中之Exception)則為doInBackground的傳回值類別,也是onPostExecute()的輸入類別。
四個函數,只有doInBackground在Working thread(沒有UI的thread)中執行,onPreExecute()第一個被執行,接著就執行doInBackground(), 這是不能省略的函數,在函數中可呼叫(也可以不呼叫)onProgressUpdate一次或多次。onPostExecute()則是在doInBackground結束後執行。

沒有留言:

張貼留言