Запустите несколько запросов Firestore и дождитесь завершения всех их - PullRequest
1 голос
/ 26 апреля 2019

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

Каким-то образом я пытаюсь достичь:

Task t1 = Query1.get().onSuccesListener.... ; 
Task t2 = Query2.get().onSuccesListener.... ; 
Task t3 = Query3.get().onSuccesListener.... ; 
Task t4 = Query4.get().onSuccesListener.... ; 

Я все равно не смог найти их для Task в Android, поэтому я попытался выполнить запрос внутри AsynTask, а затем подождать, пока все AsyncTask будут выполнены с помощью Latch onPostExecuted.

Вот пример одного из моих AsyncTask с запросом.

private class GetLandlordsRoomQuery extends AsyncTask<Void, Void, Void> {
        ArrayList<RoomPosted> landlordsRooms = new ArrayList<>();
        @Override
        protected Void doInBackground(Void... voids) {
            Query removeNonTenant = FirebaseFirestore.getInstance()
                    .collection(DataBasePath.ROOMS.getValue())
                    .whereEqualTo("landlordID", FirebaseAuth.getInstance().getUid());

            removeNonTenant.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                    for (DocumentSnapshot d : queryDocumentSnapshots) {
                        landlordsRooms.add(d.toObject(RoomPosted.class));
                    }
                }
            });
            return null;
        }
        @Override
        public void onPostExecute(Void result) {
            mLandlordsRooms = landlordsRooms;
            if (--asyncTaskLatch == 0){
                startFragmentFromLandlord();
            }
        }
    }

Проблема, с которой я здесь работаю, заключается в том, что onPostExecuted запускается до завершения запроса.

У меня может быть неправильный подход к решению этой проблемы с AsyncTask, но я не могу найти способ, используя Task, чтобы дождаться завершения всех 4 задач, не создавая с ними вложенный onCompleteListener.

Есть какие-нибудь идеи, как я могу запустить в paralell все 4 потока и дождаться их завершения, прежде чем загрузить свой фрагмент?

1 Ответ

1 голос
/ 26 апреля 2019

Вы можете просто объединить все ваши 4 отдельных запроса локально, используя метод Tasks's whenAllSuccess () . Вы можете добиться этого, используя следующие строки кода:

Task t1 = Query1.get();
Task t2 = Query2.get();
Task t3 = Query3.get();
Task t4 = Query4.get();

Task combinedTask = Tasks.whenAllSuccess(t1, t2, t3, t4).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
         //Do what you need to do with your list
    }
});

Как видите, при переопределении метода onSuccess() в результате получается list объектов, которые вы получаете из этих запросов.

Клиент Cloud Firestore уже выполняет все сетевые операции в фоновом потоке. Это означает, что все операции выполняются без блокировки вашего основного потока. Помещение в AsyncTask не дает никаких дополнительных преимуществ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...