2011-05-24 64 views
0

我創建了一個類DataAdapter,它啓動線程以從webservices獲取數據。當使用一個活動叫做如何知道外部類中的AsyncTasc已完成?

DataAdapter.InitData(); 

我怎麼能知道當兩個線程都完成了嗎?

感謝 七月

public class DataAdapter { 

    private final static String URL = "http://www.mywebservice.com"; 
    private final static String URL_AD = "http://www.mywebservice2.com"; 

    public void InitData(){ 

     new GetInitData().execute(URL); 
     new GetAd().execute(URL_AD); 

    } 

    private static class GetInitData extends AsyncTask<String, Integer, JSONObject> { 
     protected JSONObject doInBackground(String... urls) { 

      JSONObject json = RestJsonClient.getJSONObject(urls[0]); 
      return json; 
     } 

     protected void onProgressUpdate(Integer... progress) {     
     } 

     protected void onPostExecute(JSONObject json) {   

      //process data 
     } 
    } 

    private static class GetAd extends AsyncTask<String, Integer, JSONObject> { 
     protected JSONObject doInBackground(String... urls) { 

      JSONObject json = RestJsonClient.getJSONObject(urls[0]); 
      return json; 
     } 

     protected void onProgressUpdate(Integer... progress) {     
     } 

     protected void onPostExecute(JSONObject json) {   

      //process data 
     } 
    } 
} 
+0

在每個類的onPostExecute中調用一個方法來設置另一個線程中的布爾值,該線程正在等待兩個線程完成。 當他們都完成後,你可以調用另一種方法來做任何你想做的事情。 – Blundell 2011-05-24 12:14:01

回答

0

使用此:

public class DataAdapter { 

private final String URL = "http://www.mywebservice.com"; 
private final String URL_AD = "http://www.mywebservice2.com"; 
private boolean finished = false; 

public void InitData(){ 

    new GetInitData(this).execute(URL); 
    new GetAd(this).execute(URL_AD); 

} 

public void finished(){ 
    if(!finished){ 
    finished = true; 
    }else{ 
    Log.d("TAG","Both have finished"): 
    } 


private class GetInitData extends AsyncTask<String, Integer, JSONObject> { 
    Activity ac = null; 
    public GetInitData(Activity ac){ 
     this.ac=ac; 
    } 

    protected JSONObject doInBackground(String... urls) { 

     JSONObject json = RestJsonClient.getJSONObject(urls[0]); 
     return json; 
    } 

    protected void onProgressUpdate(Integer... progress) {     
    } 

    protected void onPostExecute(JSONObject json) {   

     //process data 
     ac.finished(); 
    } 
} 

private class GetAd extends AsyncTask<String, Integer, JSONObject> { 
    Activity ac = null; 
    public GetInitData(Activity ac){ 
     this.ac=ac; 
    } 

    protected JSONObject doInBackground(String... urls) { 

     JSONObject json = RestJsonClient.getJSONObject(urls[0]); 
     return json; 
    } 

    protected void onProgressUpdate(Integer... progress) {     
    } 

    protected void onPostExecute(JSONObject json) {   

     //process data 
     ac.finished(); 
    } 
} 

}

+0

什麼是'Activity ac = null; public GetInitData(Activity ac){ this.ac = ac; }'爲? – jul 2011-05-24 14:38:02

+0

獲得您正在呼叫的活動的參考。您可以將AsyncTasks設置爲私有類,但這不是一個很好的策略。當他們作爲公共課程,你將需要。閱讀此:http://stackoverflow.com/questions/4823891/android-asynctask-recommendations-private-class-or-public-class – neteinstein 2011-05-24 16:47:49

0

添加一個同步的方法給你DataAdapter類,每個在其onPostExecute中的AsyncTask卡列斯的()。在此方法中,您設置了一個布爾變量,指示第一個作業已完成,而第二個AsyncTask調用它檢查第一個線程是否已完成的方法。如果兩者都已完成,則可以使用您的自定義代碼。

相關問題