Android Can';是否将数组列表从AsyncTask返回到主活动?

Android Can';是否将数组列表从AsyncTask返回到主活动?,android,arraylist,android-asynctask,return,Android,Arraylist,Android Asynctask,Return,我不知道如何从嵌入在ArrayList中的AsyncTask返回对象。现在,如果我尝试添加tours.add(tour)到AsyncTask内的列表中,返回的回程始终为空 如何从AsyncTask内部停止并将这些对象成功返回到MainActivity 具有ArrayList的类: public class JsonParser { List<Tour> tours = new ArrayList<Tour>(); ToursDataSource d

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

如何从
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;           
    }


}
公共类JsonParser{
List tours=new ArrayList();
ToursDataSource数据源;
私有字符串日志标签;
//上下文ctx;
//公共JsonParser(上下文){
//ctx=上下文;
//}     
公共列表startJson(上下文){
AsyncHttpClient=新的AsyncHttpClient();
client.get(“http://edmondvarga.com/android_dev/party_alarm/test_j.php", 
新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
试试{
JSONObject jsonObj=新的JSONObject(响应);
JSONArray contacts=jsonObj.getJSONArray(“用户”);
对于(int i=0;i
参与我的主要活动:

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);
    }
public void createData(){
JsonParser jp=新的JsonParser();
List tours=jp.startJson(this);
//ToursPullParser=新的ToursPullParser();
//List tours=parser.parseXML(this);
用于(旅游:旅游){
创建(tour);
}

在MainActivity中,您需要等待异步调用完成。当您调用client.get时,您将生成一个单独的线程来执行网络调用,然后返回空列表。然后在MainActivity中,您将获得空列表。在onSuccess中,一旦完成解析,您可以通过处理程序或一个本地广播,通知它列表已更新。

您的问题是任务是异步的。系统执行以下操作(如图所示,为了更好地理解,我们正在处理单个内核):
callstartjson
create AsyncTask
,但现在系统仍然运行在
startJson
中。现在系统运行正常,是启动异步任务的正确时间了,它填充了您的列表。但是您已经返回了异步任务。因此解决方案非常简单。在
onSuccess
结束时,调用另一个方法,该方法对结果进行les处理,以便进行进一步操作。(或者只需在
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) {
            //....
        }
    }
公共类JsonParser{
List tours=new ArrayList();
ToursDataSource数据源;
私有字符串日志标签;
//上下文ctx;
//公共JsonParser(上下文){
//ctx=上下文;
//}   
私人最终活动mCallback;
公共JsonParser(MainActivity回调){
mCallback=回调;
}    
公共列表startJson(上下文){
AsyncHttpClient=新的AsyncHttpClient();
client.get(“http://edmondvarga.com/android_dev/party_alarm/test_j.php", 
新的AsyncHttpResponseHandler(){
@凌驾
成功时公共无效(字符串响应){
试试{
JSONObject jsonObj=新的JSONObject(响应);
JSONArray contacts=jsonObj.getJSONArray(“用户”);
对于(int i=0;i
我已经放置了要在onSuccess()中返回的值(“tours.add(tour);”);但它对返回状态没有影响,因为它在成功时被锁定在内部。即使我在成功时从内部启动另一个方法,它也不会从MainActivity调用,并且我将无法为您的负面评级返回任何内容。但是,您正在调用create Data。这将启动任务,但您不知道任务何时结束sihed。你可以从
main活动中为你的JsonParser提供一个对
this
的引用,并调用一个方法,如果它完成了。如果这不能解决你的问题,你确定你在tours中有正确的数据吗?我编辑我的帖子是为了将我的解决方案可视化。谢谢,我没有否决你的答案……不管怎样,它是正确的