无法将AsyncTask中的数组列表返回到主活动中?

时间:2014-04-21 13:01:33

标签: android arraylist android-asynctask return

我无法弄清楚如何从嵌入AsyncTask的{​​{1}}中返回对象。现在,如果我尝试将ArrayList添加到tours.add(tour);内的列表中,则返回的AsyncTask始终为空。

如何从return tours;内部制造出来并将这些对象成功返回到我的MainActivity?

具有ArrayList的类:

AsyncTask

参与我的MainActivity:

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;           
    }


}

2 个答案:

答案 0 :(得分:-1)

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

答案 1 :(得分:-1)

你的问题是任务是异步的。系统执行以下操作(我们只是在单个核心上运行以便更好地理解):call startJson create AsyncTask,但现在系统仍在startJson中运行。现在系统还可以,它是启动异步任务的最佳时机,它填满了你的列表。但是你已经退回了。所以解决方案非常简单。在onSuccess结束时调用另一个方法,该方法处理结果以进行进一步操作。 (或者只是在onSuccess中进行,因为这已经在主线程上了)

<强> @Edit:

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) {
            //....
        }
    }