交付的AsyncTask结果到其他activty [英] Delivering AsyncTask result to an other activty

查看:170
本文介绍了交付的AsyncTask结果到其他activty的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想闪屏期间从Parse.com我的数据。

我正在在doInBackground方法的查询,并添加在对象载体(这是在一个其它类)检索到的所有对象。

移动到MainActivty所有数据丢失得时。

下面是我的code:

 私有类loadDataTask扩展的AsyncTask<太虚,太虚,矢量<&PartyObj GT;> {
    @覆盖
    保护矢量<&PartyObj GT; doInBackground(虚空...... PARAMS)
    {
        ParseQuery查询=新ParseQuery(partyObj);
        query.whereExists(姓名);
        query.findInBackground(新FindCallback(){            @覆盖
            公共无效完成(列表<&的parseObject GT; mNameList,ParseException的E){
                 如果(E == NULL){
                       adapter.partyVector =新的矢量<&PartyObj GT;();
                        的for(int i = 0; I< mNameList.size();我++){
                            PartyObject方=新PartyObject();
                            party.setIndex(ⅰ);
                            party.setmName(mNameList.get(I).getString(姓名)的toString());
                            adapter.partyVector.add(甲方);                 }
                         }其他{
                        Log.d(mNameList,错误:+ e.getMessage());
                    }            }
        });
        返回adpater.partyVector;
    }
    @覆盖
    保护无效onPostExecute(矢量<&PartyObj GT;的结果){
        progressDialog.dismiss();
        的setContentView(R.layout.activity_main_menu);
    }}


解决方案

好像你正在使用的AsyncTask的都错了。 query.findInBackground()是据我可以告诉一个异步调用所以你基本上是在包装一个又一个异步调用。这里的问题是,code执行query.findInBackground()之后立即继续,从而结束了doInBackground()方法。既然你移动到主要活动时立即异步任务完成后它可能是query.findInBackground()尚未完成(从而导致空/部分列表)。

您真的确定你需要在一个异步调用包装的一切吗?无论是否

  ParseQuery查询=新ParseQuery(partyObj);
query.whereExists(姓名);

需要时间来执行或者是工作的大部分已经在异步findInBackground()调用?如果是的话,我会说跳过​​AsyncTask的和做的FindCallback的进行()方法的观点转变。

更新:我已经在读了 ParseQuery 上面清清楚楚地写着:


  

使用回调方法通常是preferred因为网络
  操作不会阻塞调用线程。然而,在某些情况下,它
  可能会更易于使用查找,获取或计算通话,里面做阻塞
  调用线程。例如,如果您的应用程序已经催生了
  后台任务执行工作,即后台任务可以使用
  阻塞调用,避免回调的code的复杂性。


而在<一个href=\"https://www.parse.com/docs/android/api/com/parse/ParseQuery.html#findInBackground%28com.parse.FindCallback%29\"相对=nofollow> findInBackground()它明确指出:


  

检索从满足这个查询ParseObjects名单
  服务器在后台线程。这是preferable来使用find()
  除非你的code在后台线程已经在运行。


既然你已经在包装的AsyncTask一切您应该跳过异步任务完全自findInBackground(在后台线程正在运行或切换到阻塞的找到()方法

例无AsyncTask的,但使用异步findInBackground():

  ParseQuery查询=新ParseQuery(partyObj);
query.whereExists(姓名);
query.findInBackground(新FindCallback(){    @覆盖
    公共无效完成(列表&LT;&的parseObject GT; mNameList,ParseException的E){
        如果(E == NULL){
            adapter.partyVector =新的矢量&lt;&PartyObj GT;();
            的for(int i = 0; I&LT; mNameList.size();我++){
                PartyObject方=新PartyObject();
                party.setIndex(ⅰ);
                party.setmName(mNameList.get(I).getString(姓名)的toString());
                adapter.partyVector.add(甲方);
            }            progressDialog.dismiss();
            的setContentView(R.layout.activity_main_menu);
        }
        其他{
            Log.d(mNameList,错误:+ e.getMessage());
        }    }
});

使用实例的AsyncTask和阻止发现()

 私有类loadDataTask扩展的AsyncTask&LT;太虚,太虚,矢量&lt;&PartyObj GT;&GT; {    @覆盖
    保护矢量&lt;&PartyObj GT; doInBackground(虚空...... PARAMS)
    {
        ParseQuery查询=新ParseQuery(partyObj);
        query.whereExists(姓名);
        矢量&lt;&PartyObject GT; V =新的矢量&lt; PartyObject();
        尝试{
            清单&LT;&的parseObject GT; QueryResult中= query.find();
            对于(PO的parseObject:QueryResult中){
                PartyObject方=新PartyObject();
                party.setIndex(partyVector.size());
                party.setmName(po.getString(姓名)的toString());
                v.add(甲方);
            }
        }
        赶上(ParseException的E){
            Log.d(mNameList,错误:+ e.getMessage());
        }
        返回伏;
    }    @覆盖
    保护无效onPostExecute(矢量&lt;&PartyObj GT;的结果){
        adapter.partyVector.addAll(结果);
        progressDialog.dismiss();
        的setContentView(R.layout.activity_main_menu);
    }
}

I am trying to retrieve my data from Parse.com during splash screen.

I'm making the query in the DoInBackground method and add all objects retrieved in an object vector (which is in an other class).

when moving to the MainActivty all data get loss.

Here's my code:

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

}

解决方案

It seems like you're using the AsyncTask all wrong. query.findInBackground() is as far as I can tell an asynchronous call so you're essentially wrapping one async call in another. The problem with this is that code execution continues immediately after query.findInBackground(), thus ending the doInBackground() method. Since you move to the main activity immediately when the async task is finished it may be that query.findInBackground() hasn't finished yet (thus resulting in an empty/partial list).

Are you really sure you need to wrap everything in an async call? Does either of

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

take time to execute or is the bulk of the work already in the async findInBackground() call? If so, I'd say skip the AsyncTask and do the view transition in the done() method of the FindCallback.

UPDATE: I've read up on ParseQuery and it clearly says:

Using the callback methods is usually preferred because the network operation will not block the calling thread. However, in some cases it may be easier to use the find, get or count calls, which do block the calling thread. For example, if your application has already spawned a background task to perform work, that background task could use the blocking calls and avoid the code complexity of callbacks.

And in findInBackground() it clearly states that:

Retrieves a list of ParseObjects that satisfy this query from the server in a background thread. This is preferable to using find(), unless your code is already running in a background thread.

Since you are already wrapping everything in an AsyncTask you should either skip the async task completely since findInBackground( is already running in a background thread or switch to the blocking find() method.

Example without AsyncTask but using async 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());                        
        }

    }
});

Example with AsyncTask and blocking 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);            
    }
}

这篇关于交付的AsyncTask结果到其他activty的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆