2015-11-24 6 views
1

Это фрагмент моего кода с небольшими изменениями в именах.Parse findInBackground не добавляет к глобальному arraylist?

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 после сделанных() размер не пуст. Однако, как только query() будет завершен, и я вернусь к initList(), если снова проверить tempListItems, он пуст.

done() - метод в запросе(). Я забыл технический термин!

Я не уверен, как убедиться, что изменения в tempListItems во время запроса() и done() остаются после его возвращения.

+0

и внутри 'done' метод? –

+0

done() внутри запроса(), извините за путаницу – 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 после Done() размер не пустой

Здесь:

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

если мы проверяем размер tempListItems внутри if-block то размер всегда zero потому что если блок выполняется сразу после запуска query.findInBackground Тема без ожидания результата задачи.

done - метод обратного вызова, который вызывается, когда findInBackground выполняется на той же самой теме, которая запущена.

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")); 
    } 
}); 
Смежные вопросы