2012-10-18 111 views
2

如何在運行某些任務之前確保異步任務完成。我需要使用變量後異步任務更改該變量的值。如果我在運行async之前運行代碼,那麼我就搞定了。任何幫助? im顯然是異步任務的新手。如果你看我的代碼即時可能不使用onPostExecute(),因爲它的意圖,所以建議會有所幫助。我最初的想法是不斷增加異步任務的內容,但我認爲這只是不好的做法,因爲我有很多必須連續運行的東西。基本上,我認爲它歸結爲:我如何確保在我的異步任務完成之前,UI線程中的任務不會開始運行。只有在異步任務完成後才需要運行任務

public class MainActivity extends MapActivity { 
myJSONmap; 

public void onCreate(Bundle savedInstanceState) { 
new AsyncStuff().execute(); 
locatePlace(myJSONmap); 

class AsyncStuff extends AsyncTask<Void, Integer, JSONObject> { 
      @Override 
      protected JSONObject doInBackground(Void... params) { 
       jObject = GooglePlacesStuff.getTheJSON(formatedURL); 
       return null; 
      } 
      @Override 
      protected void onPostExecute(JSONObject result) { 
       // TODO Auto-generated method stub 
       super.onPostExecute(result); 
       myJSONmap = JSONextractor.getJSONHMArrayL(jObject); // getting the parsed data from the JSON object. 
       //the arraylist contains a hashmap of all the relevant data from the google website. 
      } 
     } 

回答

3

你可能想了解更多有關的AsyncTask在Android開發者

http://developer.android.com/intl/es/reference/android/os/AsyncTask.html

關於小費,我個人的選擇是一個布爾值傳遞給onPostExecute。這樣,您可以評估doInBackground是否成功,然後找出要執行的操作(錯誤消息或更新佈局)。

請記住,在onPostExecute方法理想情況下應該只有使屏幕更新,假設你有數據好。在你的例子中,爲什麼不包括在doInBackground上的

myJSONmap = JSONextractor.getJSONHMArrayL(jObject); 

?然後調用

locatePlace(myJSONmap); 

像這樣:

class MyAsyncTask extends AsyncTask<Void, Void, Boolean> { 
    String errorMsg; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Integer doInBackground(Void... v) { 
     try{ 
      jObject = GooglePlacesStuff.getTheJSON(formatedURL); 
      myJSONmap = JSONextractor.getJSONHMArrayL(jObject); 
      //do stuff 
      return true; 
     } catch (JSONException e){ 
      errorMsg="Something wrong in the json"; 
      return false; 
     } 

    } 

    @Override 
    protected void onPostExecute(Boolean success) { 
     if(success){ 
      locatePlace(myJSONmap); 
      //update layout 
     } else { 
      //show error 
     } 


    } 
} 
+0

所以基本上我所有的剩餘活動將在onPostExecute() 方法?這是一個好習慣嗎? –

+0

是的,onPostExecute()是**任務完成後需要完成的**。 – nsemeniuk

+0

它可能在onPostExecute()中有很多行代碼。這個可以嗎? –

1

可以UE下面的代碼執行異步任務 -

MyAsyncTask_a asyncTask_a = new MyAsyncTask_a(); 
         asyncTask_a.execute(); 

一旦doInBackground()任務完成則只有控制將轉向postExecute()。 您不能在doInBackground中執行任何UI操作,但可以在preExecute()和postExecute()中執行此操作。

class MyAsyncTask_a extends AsyncTask<Void, Void, Integer> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected Integer doInBackground(Void... arg0) { 
      // TODO Auto-generated method stub 

      return 1; 
     } 

     @Override 
     protected void onPostExecute(Integer result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 


     } 
    } 

希望這會幫助你。

+1

難道這不是什麼即時通訊已經在做?我的問題是:我如何確保UI線程中的任務不會在我的異步任務完成之前運行。 –

+0

把你想要發生的事情放在onPostExecute函數中。 IE只需在onPostExecute中調用locatePlace。 – sgarman

+0

把所有想要在UI線程中運行的東西放在後臺執行..返回1確保一旦doInBackground塊已經結束,那麼只有它將發佈執行並在那裏運行命令 –