2013-05-20 102 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方法所需的確切時間長度內運行線程? 謝謝... –

相關問題