将异步任务结果传递给另一个活动

时间:2013-05-20 19:04:13

标签: android android-asynctask parse-platform

我正试图在启动画面期间从Parse.com检索我的数据。

我在DoInBackground方法中进行查询,并添加在对象向量中检索到的所有对象(在另一个类中)。

当转移到MainActivty时,所有数据都会丢失。

这是我的代码:

private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{


    @Override
    protected Vector<PartyObj> doInBackground(Void... params)  
    {  
        ParseQuery query = new ParseQuery("partyObj");
        query.whereExists("Name");
        query.findInBackground(new FindCallback() {

            @Override
            public void done(List<ParseObject> mNameList, ParseException e) {
                 if (e == null) {   
                       adapter.partyVector = new Vector<PartyObj>();               
                        for(int i=0; i<mNameList.size(); i++){
                            PartyObject party = new PartyObject();
                            party.setIndex(i);
                            party.setmName(mNameList.get(i).getString("Name").toString());
                            adapter.partyVector.add(party);

                 }
                         }else {
                        Log.d("mNameList", "Error: " + e.getMessage());                        
                    }

            }
        });
        return adpater.partyVector;  
    }  


    @Override
    protected void onPostExecute(Vector<PartyObj> result) {
        progressDialog.dismiss();
        setContentView(R.layout.activity_main_menu);            
    }

}

2 个答案:

答案 0 :(得分:0)

好像你使用AsyncTask都错了。 query.findInBackground()就我所说的异步调用而言,所以你实际上是在另一个异步调用中包含一个异步调用。这个问题是在query.findInBackground()之后代码执行立即继续,从而结束了doInBackground()方法。由于在异步任务完成后立即移动到主活动,可能是query.findInBackground()尚未完成(因此导致空/部分列表)。

你真的确定需要在异步调用中包装所有内容吗?是

ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");

需要时间来执行,还是已经在异步findInBackground()调用中的大部分工作?如果是这样,我会说跳过AsyncTask并在FindCallback的done()方法中进行视图转换。

更新:我已阅读ParseQuery,并清楚地说:

  

通常首选使用回调方法,因为网络   操作不会阻塞调用线程。但是,在某些情况下呢   可能更容易使用查找,获取或计数调用,这会阻止   调用线程。例如,如果您的应用程序已经生成了一个   后台任务执行工作,后台任务可以使用   阻止调用并避免回调的代码复杂性。

findInBackground()中,它明确指出:

  

从中检索满足此查询的ParseObjects列表   服务器在后台线程。这比使用find()更好   除非你的代码已经在后台线程中运行。

由于您已经将所有内容包装在AsyncTask中,因此您应该完全跳过异步任务,因为findInBackground(已经在后台线程中运行或切换到阻塞find()方法。

没有AsyncTask但使用异步findInBackground()的示例:

ParseQuery query = new ParseQuery("partyObj");
query.whereExists("Name");
query.findInBackground(new FindCallback() {

    @Override
    public void done(List<ParseObject> mNameList, ParseException e) {
        if (e == null) {   
            adapter.partyVector = new Vector<PartyObj>();               
            for(int i=0; i<mNameList.size(); i++){
                PartyObject party = new PartyObject();
                party.setIndex(i);
                party.setmName(mNameList.get(i).getString("Name").toString());
                adapter.partyVector.add(party);
            }

            progressDialog.dismiss();
            setContentView(R.layout.activity_main_menu);                    
        }
        else {
            Log.d("mNameList", "Error: " + e.getMessage());                        
        }

    }
});

使用AsyncTask并阻止find()

的示例
private class loadDataTask extends AsyncTask<Void, Void, Vector<PartyObj>>{

    @Override
    protected Vector<PartyObj> doInBackground(Void... params)  
    {  
        ParseQuery query = new ParseQuery("partyObj");
        query.whereExists("Name");
        Vector<PartyObject> v = new Vector<PartyObject();
        try {
            List<ParseObject> queryResult = query.find();
            for(ParseObject po : queryResult) {
                PartyObject party = new PartyObject();
                party.setIndex(partyVector.size());
                party.setmName(po.getString("Name").toString());
                v.add(party);
            }
        }
        catch(ParseException e) {
            Log.d("mNameList", "Error: " + e.getMessage());
        }
        return v;
    }

    @Override
    protected void onPostExecute(Vector<PartyObj> result) {
        adapter.partyVector.addAll(result);
        progressDialog.dismiss();
        setContentView(R.layout.activity_main_menu);            
    }
}

答案 1 :(得分:0)

我已经实现了类似的异步类来获取解析服务器数据

 private class Getneworders_list extends AsyncTask<Void, Void, List<ParseObject>> {

    ArrayList<HashMap<String, String>>  neworders_hashmap;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        neworders_recyclerView.getRecycledViewPool().clear();
    }

    @Override
    protected List<ParseObject> doInBackground(Void... params) {

        // Create the array
        try {

            ParseQuery<ParseObject> query = ParseQuery.getQuery("Orders");
            ParseObject obj = ParseObject.createWithoutData("ShopLocations", idd);
            query.whereEqualTo("shop", obj);
            query.whereEqualTo("orderStatus",0);
            query.setCachePolicy(ParseQuery.CachePolicy.IGNORE_CACHE);
            query.orderByDescending("updatedAt");
            object11 = query.find();

        } catch (ParseException e) {
            Log.d("Error", e.getMessage());
            e.printStackTrace();
        }

        return object11;
    }

    @Override
    protected void onPostExecute(List<ParseObject> result) {

        neworders_hashmap = new ArrayList<HashMap<String, String>>();

        if(result != null) {

            if (result.size() > 0) {
                chec(result.size());
                m_Runnable.run();
            }
        }

    }
}

用尽一个