2012-10-05 60 views
0

正如我所說的,這是AsyncTask的正確使用嗎?可以這樣使用AsyncTask:

我的意思是,在不使用任何參數的情況下,將活動上下文傳遞給onPreExecute(),並且沒有得到返回值的結果,但管理器本身調用onPostExecute()

另外還有一件事,Asynctask API Reference提到了onPostExecute():「如果任務被取消,將不會調用此方法。」 ,那麼如果在執行doInBackground()方法時發生SomeException,那麼如何調用onPostExecuted()

public class MainClass { 
    ... 
    //Somewhere in the class, the task is called: 
    new MyAsyncTask.execute(); 
    ... 

    private class MyAsyncTask extends AsyncTask <Void,Void,Void> { 

     private MyManager manager; 

     protected void onPreExecute(){ 
      super.onPreExecute(); 
      //We initialice the members here, passing the context like this: 
      manager = new Manager(MainClass.this); 
      manager.initializeMembers(); 
     } 

     protected void doInBackgroud(Void ...params){ 
      try{ 
       //here we use the long operation task that is inside the manager: 
       manager.startLongTask();     
      } catch (SomeException e){ 
       doWhatEverItIsWith(e); 
      } 
      return null; 
     } 

     protected void onPostExecute (Void result){ 
      super.onPostExecute(result); 
      //Here we get the result from the manager 
      handleTheResultFromHere(manager.getResult()); 
     } 
    } 
} 

謝謝。

回答

1

正如我所說的,這是AsyncTask的正確使用嗎?

是的,其確定通過所述活動上下文中onPreExecute(),然後在doInBackgroud()加載的數據,並在onPostExecute()更新UI。

所以一下如果一邊做 doInBackground()方法SomeException發生,¿是onPostExecuted什麼()叫什麼?

是的,onPreExecute()將被調用,如果你在doInBackgroud()得到任何例外。您必須檢查要加載的數據是否在onPreExecute()檢查數據是否爲空並更新UI。

NOTE: 

不要試圖從doInBackgroud()更新UI,它會給你例外,你不能從一個非UI線程更新UI。替代方案是使用HandlerrunOnUIThread()從非UI線程更新UI。

1

這樣使用AsyncTask沒有問題。您不必使用doInBackground返回值。關於第二個問題,即使在例外的情況下也會調用onPostExecute。如果你不想打電話,你將不得不使用MyAsyncTask.cancel(true)

相關問題