【问题标题】:Can't return an Array list from AsyncTask into Main Activity?无法将 AsyncTask 中的数组列表返回到 Main Activity?
【发布时间】:2014-06-05 13:16:38
【问题描述】:

我不知道如何从嵌入在ArrayList 中的AsyncTask 返回对象。现在,如果我尝试将tours.add(tour); 添加到AsyncTask 内的列表中,则返回的return tours; 始终为空。

我怎样才能从AsyncTask 内部退出并成功地将这些对象返回到我的MainActivity??

具有 ArrayList 的类:

public class JsonParser {

    List<Tour> tours = new ArrayList<Tour>();   
    ToursDataSource datasource;
    private String LOGTAG;
    //Context ctx;  
    //public JsonParser(Context context){
    //  ctx = context;
    //}     

    public List<Tour> startJson(Context context) {      

        AsyncHttpClient client = new AsyncHttpClient();     
        client.get("http://edmondvarga.com/android_dev/party_alarm/test_j.php", 
                new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(String response) {                
                try {                   
                    JSONObject jsonObj = new JSONObject(response);
                    JSONArray contacts = jsonObj.getJSONArray("users");

                    for (int i=0; i< contacts.length();i++){
                        JSONObject json = contacts.getJSONObject(i);

                        Tour tour = new Tour();
                        tour.setTitle(json.getString("title"));
                        //String c = json.getString("content");

                        Log.i(LOGTAG, "Tour created with id:" +tour.getTitle());                        
                        tours.add(tour);                        
                    }                   
                } catch (JSONException e) {                 
                    e.printStackTrace();
                }                       
            }
         });        

        return tours;           
    }


}

参与我的 MainActivity:

public void createData() {  

    JsonParser jp = new JsonParser();
    List<Tour> tours = jp.startJson(this);

    //ToursPullParser parser = new ToursPullParser();
    //List<Tour> tours = parser.parseXML(this);

    for (Tour tour : tours) {
            datasource.create(tour);
    }

【问题讨论】:

    标签: android arraylist android-asynctask return


    【解决方案1】:

    您的问题是任务是异步的。系统执行以下操作(为了更好地理解,我们只是在单核上工作):call startJsoncreate AsyncTask,但现在系统仍在startJson 中运行。现在系统一切正常,现在是启动异步任务的正确时间,它会填满您的列表。但是你已经退货了。所以解决方案非常简单。在onSuccess 结束时调用另一个方法,该方法处理结果以供进一步操作。 (或者直接在onSuccess做,因为这已经在主线程上了)

    @编辑:

    public class JsonParser {
    
        List<Tour> tours = new ArrayList<Tour>();   
        ToursDataSource datasource;
        private String LOGTAG;
        //Context ctx;  
        //public JsonParser(Context context){
        //  ctx = context;
        //}   
        private final MainActivity mCallback;
    
        public JsonParser(MainActivity callback) {
            mCallback = callback;
        }    
    
        public List<Tour> startJson(Context context) {     
    
            AsyncHttpClient client = new AsyncHttpClient();     
            client.get("http://edmondvarga.com/android_dev/party_alarm/test_j.php", 
                    new AsyncHttpResponseHandler() {
    
                @Override
                public void onSuccess(String response) {                
                    try {                   
                        JSONObject jsonObj = new JSONObject(response);
                        JSONArray contacts = jsonObj.getJSONArray("users");
    
                        for (int i=0; i< contacts.length();i++){
                            JSONObject json = contacts.getJSONObject(i);
    
                            Tour tour = new Tour();
                            tour.setTitle(json.getString("title"));
                            //String c = json.getString("content");
    
                            Log.i(LOGTAG, "Tour created with id:" +tour.getTitle());                        
                            tours.add(tour);                        
                        }                   
                    } catch (JSONException e) {                 
                        e.printStackTrace();
                    }   
                    callback.setResult(tours);     
                }
             }); 
    
    
    
    
    public class MainActivity....
    
        public void createData() {
            JsonParser jp = new JsonParser(this);
            List<Tour> tours = jp.startJson(this);
        }
    
        public void setResult(List<Tour> tours) {
            for(Tour t : tours) {
                //....
            }
        }
    

    【讨论】:

    • 我已经将想要返回的值 ("tours.add(tour);") 放入 onSuccess ();但它对返回语句没有影响,因为它被锁定在 onSuccess 中。即使我从 onSuccess 内部启动另一个方法,它也不会从 MainActivuty 调用,我将无法返回任何内容
    • 感谢您的负面评价。但是,您调用的是 create Data。这将启动任务,但您不知道何时完成。您可以从 MainActivity 为您的 JsonParser 提供对 this 的引用,并调用一个方法(如果已完成)。如果这不能解决您的问题,您确定您在游览中拥有正确的数据吗?我编辑我的帖子以可视化我的解决方案。
    • 谢谢,我没有否决您的回答...无论如何,这对我的问题来说是一个不错的解决方案。谢谢!
    • 好吧,这不是给你的消息。谁投了反对票?请解释一下,以便我改进我的答案!
    【解决方案2】:

    在 MainActivity 中,您需要等到 AsyncCall 完成。当您调用 client.get 时,您会生成一个单独的线程来进行网络调用,然后返回空列表。然后在 MainActivity 你得到空列表。在 onSuccess 中,完成解析后,您可以通过处理程序或本地广播将消息发送回主活动,以通知它列表已更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 2017-12-30
      • 2011-06-30
      • 2012-08-09
      • 2015-10-21
      • 2021-03-27
      • 1970-01-01
      相关资源
      最近更新 更多