2016-01-11 28 views
1

我想用一個分析查詢返回的結果填充ArrayList。當我得到結果時,我將它們添加到ArrayList中,並將ArrayList大小打印到控制檯,以確保添加結果,這是成功的,但是當我返回ArrayList時,它是空的。誰能向我解釋爲什麼會發生這種情況?Parse.com Android公共無效完成不正確地返回我的ArrayList

public ArrayList<ParseObject>findAllGroupByUserId(ParseUser userId){ 
    //TODO hier uit db halen alle groupen van user 
    final ArrayList<ParseObject> groups = new ArrayList<>(); 
    ParseQuery<Group_user> query = ParseQuery.getQuery("Group_user"); 
    query.whereEqualTo("user_id", userId); 
    query.findInBackground(new FindCallback<Group_user>() { 
     @Override 
     public void done(List<Group_user> objects, ParseException e) { 
      if (e == null) { 
       for (Group_user group : objects) { 
        Log.e("SUCCESS", group.getObjectId() + " , " + group.getGroup_id().getObjectId()); 
        ParseObject g = new Group(); 
        groups.add(g); 

       } 
       System.out.println(groups.size() + " :Done method"); //THIS RETURNS 2 
      } else { 
       Log.e("ERROR", "message: " + e); 
      } 
      Log.e("SUCCESS", "we have " + groups.size() + " results"); 
     } 
    }); 
    System.out.println(groups.size() + " :return"); // THIS RETURNS 0 
    return groups; 
} 

回答

1

因爲findInBackground()在不同的線程上異步運行。您需要執行done()回調中的剩餘邏輯以獲取已填充的數組。

把它看成是這樣的:

線程1 - >調用findInBackground() - >螺紋一個正在運行----------->組是空的,直到線程2個完成

線程2產生 - >伸出服務器並獲得查詢結果 - >調用線程1(現在你有數據準備好)回調

+0

那麼,我必須將return語句放在done()回調函數中?我無法將完成的方法更改爲ArrayList,因爲它是一種重寫方法。 – Montoo

+0

是的,你不能從它返回,所以你需要填充或做數據獲取後需要做的事情。你可以做一些像populateViews(groups)之類的東西,然後從done()方法中調用它。 populateViews()將你的數據映射到你的視圖 – Naveed

+0

那麼,讓我的findAllGroupsByUserId方法返回什麼也是有意義的嗎? – Montoo

0

因此,我假設Group_user是ParseObject的子類,已經定義。由於findInBackground是異步的,因此您應該將函數的調用邏輯更改爲異步。不要像以前那樣返回對象列表,而是在查詢的done函數中執行所有邏輯,而無需返回。

public void findAllGroupByUserId(ParseUser userId) { 
    ParseQuery<Group_user> query = ParseQuery.getQuery("Group_user"); 
    query.whereEqualTo("user_id", userId); 
    query.findInBackground(new FindCallback<Group_user>() { 
     @Override 
     public void done(List<Group_user> groups, ParseException e) { 
      if (e == null && groups != null) { 
       for (Group_user group : groups) { 
        // perform all logic here 
       } 
      } else { 
       Log.e("Find Callback", "Oh no! Query failed!"); 
      } 
     } 
    }); 
}