Почему метод всегда возвращает 0

211
13 апреля 2017, 16:33

Есть метод, но почему то он всегда возвращает 0, а список заполняется в чем проблема?

public List<CategoryList> getTodayItems() {
    categoriesList = new ArrayList<>();
    String userID = user.getUid();
    // Write a message to the database
    myRef = fbDatabase.getReference(userID);
    myRef.keepSynced(true);
    myRef.child(DBHelper.TABLE_OPERATIONS).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            categoriesList = new ArrayList<>();
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                CategoryList post = postSnapshot.getValue(CategoryList.class);
                categoriesList.add(post);
            }
            Log.d(LOG_TAG, "categoriesList size after = " + categoriesList.size());
        }
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(LOG_TAG, "Failed to read value.", error.toException());
        }
    });
    Log.d(LOG_TAG, "categoriesList size inReturn = " + categoriesList.size());
    return categoriesList;
}

Answer 1
  1. Вы запускаете метод.
  2. Он запускает асинхронную операцию по получению данных из FireBase.
  3. Эти данные могут прийти быстро, очень не быстро или вообще не прийти.
  4. Не дожидаясь того что произойдёт в п.3 вы возвращаете пустой список данных

Так как вы планируете написать у вас не получится из-за того, что действия в разных потоках происходят. Вам надо перестроить логику так, чтобы нигде не было нужды синхронно получать данные, получаемые асинхронно.

Я бы это сделал с помощью RxJava как-то так:

Observable.<List<CategoryList>>create(subscriber -> {
    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    firebaseDatabase.getReference()
            .child(DBHelper.TABLE_OPERATIONS)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                   List<CategoryList> categoriesList = new ArrayList<>();
                   for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                       CategoryList post = postSnapshot.getValue(CategoryList.class);
                       categoriesList.add(post);
                    }
                    subscriber.onNext(categoriesList);
                    subscriber.onCompleted();
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    subscriber.onError(databaseError.toException());
                }
            });
})
.subscribe(
    data -> {//вот обновлённые данные из Firebase},
    e -> {//какая-то огибка произошла}
);
READ ALSO
Проблема с RecycleView

Проблема с RecycleView

В тестовом приложении я пытаюсь работать с RecyclerView и прокручивать recycleview items синхронноОднако во время горизонтальной прокрутки у меня появляется...

345
Android и bitrix

Android и bitrix

Есть сайт на битриксе, к которому подключена база данныхЧерез сайт можно заказать еду (сайт службы доставки), заказ вносится в базу

180
Проблема с запуском UI тестов

Проблема с запуском UI тестов

Столкнулся с странной ситуациейПытаюсь разобраться с мержем дева в мою ветку с тестами

221