0

我正在尝试在初始屏幕期间从 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);            
    }

}
4

2 回答 2

0

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

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

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

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

更新:我已经阅读了ParseQuery,它清楚地说:

通常首选使用回调方法,因为网络操作不会阻塞调用线程。但是,在某些情况下,使用 find、get 或 count 调用可能会更容易,它们会阻塞调用线程。例如,如果您的应用程序已经产生了一个后台任务来执行工作,那么该后台任务可以使用阻塞调用并避免回调的代码复杂性。

findInBackground()中明确指出:

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

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

没有 AsyncTask 但使用 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());                        
        }

    }
});

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);            
    }
}
于 2013-05-20T20:16:13.350 回答
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();
            }
        }

    }
}

对某人使用完整的

于 2019-07-24T10:04:14.087 回答