2013-05-20 71 views
0

我想在启动屏幕期间从Parse.com检索我的数据。将AsyncTask结果传递给其他活动

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

} 

回答

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和阻塞查找()

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

嗨,britzl,感谢您的回复。 它在完成MainActivity之前完成查询。 我已经修复了我的代码中的一些错误,现在我的问题是我不知道如何将onPostExecute方法的结果中的对象传递给其他Activity(我的listAdapter活动)。 –

+0

我很抱歉,但我不明白在进入主要活动之前它是如何完成查询的。我会更新我的答案以解释我对此的看法。 – britzl

+0

是啊......你是对的...... :) 我用10秒的线程在OnCreate上运行findInBackground,它都很好。 2个其他问题: 1.如何将我的矢量对象传递到我的listAdapter? 2.如何在findInBackground方法所需的确切时间长度内运行线程? 谢谢... –

相关问题