2011-05-24 63 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调用它检查第一个线程是否已完成的方法。如果两者都已完成,则可以使用您的自定义代码。

相关问题