2015-11-24 61 views
1

這是我的代碼的一個片段,在名稱中進行小編輯。解析findInBackground不會添加到全局數組列表?

String[] items; 
ArrayList<String>tempListItems; 

public void initList() { 
     if(query()){ 
      items = new String[tempListItems.size()]; 
      items = tempListItems.toArray(items); 
      Arrays.sort(items); 

      Log.d("HSearch - initList", "Generate Clean List"); 
      Log.d("initList - temp size", Integer.toString(tempListItems.size())); 
      Log.d("initList - items size", Integer.toString(items.length)); 
     } 
    } 

private boolean query() { 
     tempListItems = new ArrayList<String>(); 
     ParseQuery<ParseObject> query = ParseQuery.getQuery("Table"); 
     query.orderByAscending("name"); 
     query.findInBackground(new FindCallback<ParseObject>() { 
      @Override 
      public void done(List<ParseObject> list, com.parse.ParseException e) { 
       if (e == null) { 
        for (ParseObject name : list) { 
         tempListItems.add(name.getString("name")); 
        } 
       } else { 
        Log.d("score", "Error: " + e.getMessage()); 
       } 
      } 
     }); 
     return true; 
    } 

我的問題是在查詢(),如果我檢查tempListItems後大小done()的大小不是空的。但是,一旦query()完成並返回到initList(),如果再次檢查tempListItems,它是空的。

done()是query()中的一個方法。我忘了它的技術術語!

我不確定如何確保在query()和done()函數返回後,對tempListItems所做的更改。

+0

和內部完成的方法? –

+0

done()在query()內部,對於混淆抱歉 – Tony

回答

3
String[] items; 
final ArrayList<String>tempListItems; 
{ 
    tempListItems= new ArrayList<>(); 
} 

public void initList() { 
    if(query()){ 
     items = new String[tempListItems.size()]; 
     items = tempListItems.toArray(items); 
     Arrays.sort(items); 

     Log.d("HSearch - initList", "Generate Clean List"); 
     Log.d("initList - temp size", Integer.toString(tempListItems.size())); 
     Log.d("initList - items size", Integer.toString(items.length)); 
    } 
} 

private boolean query() { 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Table"); 
    query.orderByAscending("name"); 
    query.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> list, com.parse.ParseException e) { 
      if (e == null) { 
       for (ParseObject name : list) { 
        tempListItems.add(name.getString("name")); 
       } 
      } else { 
       Log.d("score", "Error: " + e.getMessage()); 
      } 
     } 
    }); 
    return true; 
} 

改變了你的代碼,這應該工作,因爲它爲我工作。

使您的方法公開在其他類中使用。

1

正如在這裏看到:

findInBackground檢索滿足從後臺線程源此查詢ParseObjects的列表。

意思findInBackground方法運行在不同的線程從中調用query.findInBackground方法。

如果我檢查後tempListItems的大小()完成規模並不 空

這裏:

if(query()){ 
    //.... 
    } 

如果我們檢查的tempListItems尺寸內if-block那麼大小總是zero因爲如果塊剛開始執行query.findInBackground線程無需等待任務結果。

done是一個回調方法,當findInBackground在啓動它的同一個Thread上執行完成時會調用該方法。

1

query()將返回true沒有done響應的等待。這就是爲什麼list爲空。

代碼放在done成功

private void query() { 
    ParseQuery<ParseObject> query = ParseQuery.getQuery("Table"); 
    query.orderByAscending("name"); 
    query.findInBackground(new FindCallback<ParseObject>() { 
     @Override 
     public void done(List<ParseObject> list, com.parse.ParseException e) { 
      if (e == null) { 
       for (ParseObject name : list) { 
        tempListItems.add(name.getString("name")); 
       } 

       items = new String[tempListItems.size()]; 
       items = tempListItems.toArray(items); 
       Arrays.sort(items); 

       Log.d("HSearch - initList", "Generate Clean List"); 
       Log.d("initList - temp size", 
         Integer.toString(tempListItems.size())); 
       Log.d("initList - items size", 
         Integer.toString(items.length)); 
      } else { 
       Log.d("score", "Error: " + e.getMessage()); 
      } 
     } 
    }); 
} 
2

如何query.findInBackground之前創建一個處理程序:

Handler handler = new Handler(); 

,並把對循環內handler.post(Runnable接口) :

handler.post(new Runnable(){ 
    @Override 
    run(){ 
     for (ParseObject name : list) 
      tempListItems.add(name.getString("name")); 
    } 
});