2012-04-04 63 views
7

我正在開發一個Android應用程序,它需要使用AsyncTask進行網絡連接。我從主線程調用它。因此,方法運行並返回到onPostExecute方法。執行onPostExecute方法後,我想要返回一個值到被調用的地方,因爲我必須在那個需要從onPostExecute方法返回的值的特定活動中進行一些操作。 我該如何解決這個問題?如何從onPostExecute返回值?AsyncTask中的OnPostExcecute方法返回值?

由於提前

+0

請參閱http://stackoverflow.com/questions/5457493/asynctask-return-value和http://stackoverflow.com/questions/5457493/asynctask-return-value – ngesh 2012-04-04 05:32:52

+0

[看到這個答案](http:// stackoverflow.com/questions/7618614/return-data-from-asynctask-class/7618705#7618705) – 2012-04-04 06:13:01

回答

8

的AsyncTask,正如它的名字所說,與UI線程異步運行,則onPostExecute方法將被調用在未來的某個時候,當doInBackground結束時。我們不在乎何時調用onPostExecute方法(實際上在項目構建時沒有辦法告訴),我們關心的唯一的事情是onPostExecute方法將保證在未來的某個時刻被底層框架正確調用。所以onPostExecute方法的目的是處理從工作線程返回的結果,這也是爲什麼onPostExecute方法的唯一參數是從doInBackground方法返回的結果的原因。

我必須在該特定的活動,它需要從onPostExecute方法返回值的操作。我該如何解決這個問題?

因此,您可以在Activity類中創建一些實例變量(或使用listerner模式)存儲返回並在onPostExecute方法中準備好的結果。問題是你永遠不知道在項目構建時何時在onPostExecute方法之外準備好此結果,因爲它實際上是在應用程序運行時確定的。除非您編寫一些等待機制連續輪詢結果,這導致犧牲了AsyncTask的好處,例如,內置的API AsyncTask.get()使AsyncTask與UI線程同步運行,並將結果返回給Activity。

最佳實踐是更改您的設計,並將需要從AsyncTask返回的結果的操作代碼移動到onPostExecute方法中。希望這可以幫助。

+0

@ManJan,最近我回答了一個類似的問題[在這裏](http://stackoverflow.com/questions/10115243)/after-asynctask-execute-do-x-from-activity/10115881#10115881)解釋有關AsyncTask如何與UI線程一起工作的更多細節,希望這會有所幫助。 – yorkw 2012-04-13 00:14:50

5

你可以使用getter和setter從AsyncTask獲得價值回

public class MainActivity extends Activity { 
    public String retunnumfromAsyncTask; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.layouttest); 
     new Asyntask(this).execute(); 
    } 

    public class Asyntask extends AsyncTask<Void, Void, String> { 
     private final Context Asyntaskcontext; 

     public Asyntask(Context context){ 
      Asyntaskcontext = context; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      MainActivity mainactivity = (MainActivity) Asyntaskcontext; 
      mainactivity.retunnumfromAsyncTask = result;  
      super.onPostExecute(result); 
     } 
    } 
} 
1

只需將AsyncTask類作爲內部類寫入您的活動,然後聲明任何您希望返回爲全局的值。是不是對您有幫助?