Как мне ждать, пока мои данные не будут получены из Firebase? [Дубликат]

1

Моя проблема в том, что мне нужно подождать, пока данные из Firebase будут извлечены по методу "onDataChange", прежде чем завершить мой основной метод.

Мой код (CalendarDbHelper):

public synchronized ArrayList<Day> listDays()
    {
       final  CountDownLatch done = new CountDownLatch(1);
        db.addValueEventListener(new ValueEventListener() {

            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists())
                {
                    for(DataSnapshot postSnapShot:dataSnapshot.getChildren())
                    {
                        Day day=postSnapShot.getValue(Day.class);
                        listDays.add(day);

                    }
                }
               done.countDown();
            }


            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }

        });

        try {
            done.await(); 
        } catch(InterruptedException e) {
            e.printStackTrace();
        }
        return listDays;

    }

Как вы можете видеть, я уже пытаюсь ждать с CountDownLatch, но это не работает: он застревает.

Мне нужен listDays для действия "CalendarActivity", где я использую его следующим образом:

 //Real initialization of the database
        db = FirebaseDatabase.getInstance().getReference();
        mDatabase = new CalendarDbHelper(db);
        final List<Day> allDays = mDatabase.listDays();



        //Activating things to click on
        if(allDays.size() > 0){
            calendarRV.setVisibility(View.VISIBLE);
            calendarRVAdapter = new CalendarAdapter(this, allDays, new CalendarAdapter.OnListItemClickListener() {

                @Override
                public void onListItemClick(int clickedItemIndex) {
                    String id = allDays.get(clickedItemIndex).getId();
                    MyCustomAlertDialog(id);
                }
            });
            calendarRV.setAdapter(calendarRVAdapter);
        }else {
            calendarRV.setVisibility(View.GONE);
            Toast.makeText(this, "There is no product in the database. Start adding now", Toast.LENGTH_LONG).show();
        }
Теги:
firebase
firebase-realtime-database

2 ответа

0

если это ваш "основной метод", вы должны поместить возвращаемые данные при срабатывании onDataChange

  • 0
    Я не очень понимаю, как я должен это сделать .. Вы хотите, чтобы я поместил "return listDays" внутри onDataChange?
  • 0
    @Nouxy твой "основной метод" вызывает эту функцию для получения данных ???
Показать ещё 3 комментария
0

Попробуй это.

 public synchronized ArrayList<Day> listDays()
    {
   final  CountDownLatch done = new CountDownLatch(1);
    db.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
{
            if(dataSnapshot.exists())
            {
                for(DataSnapshot postSnapShot:dataSnapshot.getChildren())
                {
                    Day day=postSnapShot.getValue(Day.class);
                    listDays.add(day);

                }

             // Do whatever you want to do with your list from here..

            }
           done.countDown();
        }


        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }

    });

    try {
        done.await(); 
    } catch(InterruptedException e) {
        e.printStackTrace();
    }
    return listDays;

}
  • 0
    Он не работает, так как день, созданный внутри цикла for, не распознается в строке listDays.add (day); который находится вне цикла for: /
  • 0
    Таким образом, окончательное решение - обновленный ответ. Я застрял в этой ситуации тоже, несколько дней назад. Я попробовал этот способ работать. И все работает отлично.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню