Почему размер ArrayList-а равна нулю?

242
05 марта 2017, 06:37

У меня есть list , в которую хочу добавить данные которые беру из базы. Есть функция func , где я добавляю в мой list записи. Казалось бы после вызванной функции , размер list-а должен увеличиться . Чтобы удостовериться в этом я проверил размер сразу же после вызова функции func. Но размер оказался равен нулю. Но если проверить размер list-а внутри функции func , то он вовсе не ноль. В чем может быть причина? Мне кажется я не знаю какую-то простую базовую вещь.

P.S : Для читабельности я минимизировал размер кода

public class TaskActivity extends AppCompatActivity {
ArrayList<Task> list ;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_task);
    list = new ArrayList<>() ;
    func() ; // вызов функции
    tx.setText("Size:" + list.size()); //проверка размера
}
public void func()
{
  Backendless.Persistence.of(Task.class).find(new AsyncCallback<BackendlessCollection<Task>>() {
       @Override
       public void handleResponse(BackendlessCollection<Task> response) {
        Iterator<Task> it = response.getCurrentPage().iterator();
        while(it.hasNext())
           {
               Task t =  it.next() ;
               list.add(t) ;
        }
           //tx.setText("Size:" + list.size()); // проверка размера внутри функции

       }
       @Override
       public void handleFault(BackendlessFault fault) {
           Toast.makeText(getApplicationContext() , "WRONG!!!" ,         Toast.LENGTH_SHORT).show();

       }
   }) ;

}

}

Answer 1

Я не знаток Java, но, судя по документации, вы используете асинхронную версию поиска. Это значит, как минимум, две вещи:

  1. Поток выполнения программы (после вызова find) не будет прерван.
  2. На выполнение find потребуется какое-то время.

Из этого следует, что вы вызываете метод func(), он запускает асинхронную операцию и тут же возвращается обратно в метод onCreate где вы проверяете размер коллекции. Но, метод find ещё не успел завершить работу и вызвать callback handleResponse, где вы, по вашей задумке, заполняете коллекцию list.

Тут несколько путей решения вашей проблемы:

  1. Переместить/вызвать код проверки в подходящий метод AsyncCallback
  2. Использовать синхронную версию find (т.е. ту, которая блокирует поток выполнения программы пока выполняется)

Всё та же документация подсказывает подходящий метод:

public BackendlessCollection<Map> Backendless.Persistence.of( "TABLE-NAME" ).find()
READ ALSO
Каскадное удаление с БД one-to-many Hibernete

Каскадное удаление с БД one-to-many Hibernete

Имею две таблицы DEPARTMENT и EMPLOYEE (первая родительская, а вторая - дочерняя)То есть, каждому департаменту соответствует список сотрудников (связь...

310
Исключение при преобразовании string в int

Исключение при преобразовании string в int

При вводе строки состоящей не только из цифр происходит ошибка

307
Список ListView

Список ListView

Необходимо сделать список из семи дней неделиЯ Id уже дал и нашёл

255
Проверка существования каталога

Проверка существования каталога

Как проверить существует ли каталог?

334