Как выполнить firebase-функцию синхронно внутри цикла for? - PullRequest
0 голосов
/ 26 апреля 2018

Я получаю данные из firebase базы данных внутри цикла, но проблема в том, что firebase функции не выполняются синхронно, я знаю, firebase функции асинхронные.есть ли какое-то решение для этого?

Код: -

registrationReference.child(userId).child("generated_links").addListenerForSingleValueEvent(new ValueEventListener()
        {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                peopleModelList.clear();

                for(DataSnapshot snapshot : dataSnapshot.getChildren())
                {
                    peopleModel = new PeopleModel();

                    peopleHashMap =(HashMap)snapshot.getValue();

                    peopleModel.setChatWith((String)peopleHashMap.get("chatWith"));
                    peopleModel.setNickname((String)peopleHashMap.get("nickname"));
                    peopleModel.setChatRoom(snapshot.getKey());

                    Log.d("kkkk","1st");

                    if(peopleModel.getChatWith()!=null && !("".equals(peopleModel.getChatWith())))
                    {
                        registrationReference.child(peopleModel.getChatWith()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                peopleModel.setRefresh_token((String)dataSnapshot.child("refresh_token").getValue());
                                peopleModelList.add(peopleModel);
                                Log.d("kkkk","2nd");
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
                    }
                    Log.d("kkkk","3rd");

                }
                iCallBackPeople.peopleAct(peopleModelList);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });

Выход: -

1st
3rd
2nd

Ноя хочу вывод, подобный этому

1st
2nd
3rd

Примечание: - Я искал, но не нашел никакого решения!

Как получить данные из базы данных Firebase вloop?

Firebase addListenerForSingleValueEvent, извините позже в цикле

Я пробовал это, но у меня не получилось, это заполнить мой список последним элементом!

public void listOfUsers(final ICallBackPeople iCallBackPeople) {
        count=0;
        //peopleModelList = new ArrayList<>();
        sortedMap = new TreeMap<>();
       // peopleModelList = new ArrayList<PeopleModel>(sortedMap.values());
        registrationReference.child(userId).child("generated_links").addListenerForSingleValueEvent(new ValueEventListener()
        {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
             //   peopleModelList.clear();

                for(DataSnapshot snapshot : dataSnapshot.getChildren())
                {
                    peopleModel = new PeopleModel();

                    peopleHashMap =(HashMap)snapshot.getValue();

                    peopleModel.setChatWith((String)peopleHashMap.get("chatWith"));
                    peopleModel.setNickname((String)peopleHashMap.get("nickname"));
                    peopleModel.setChatRoom(snapshot.getKey());

                    //Object chatRoom = snapshot.getKey();
                    Log.d("kkkk","1st");

                    if(peopleModel.getChatWith()!=null && !("".equals(peopleModel.getChatWith())))
                    {

                        addItem(count,iCallBackPeople);
                        count++;
                    }
                    Log.d("kkkk","3rd");

                }
                Log.d("kkkk","end");
                //iCallBackPeople.peopleAct(peopleModelList);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }

    private void addItem(final int index, final ICallBackPeople iCallBackPeople) {
        registrationReference.child(peopleModel.getChatWith()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                peopleModel.setRefresh_token((String)dataSnapshot.child("refresh_token").getValue());
                Log.d("kkkk","2nd");
                sortedMap.put(index, peopleModel);
                // sortedMap will sort your list by key (in this case, key is integer)


                 if(sortedMap.size()==2)
                 {
                     peopleModelList = new ArrayList<PeopleModel>(sortedMap.values());
                     iCallBackPeople.peopleAct(peopleModelList);
                 }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

Я пробовал это, но не получил весь элемент, получая список только с последним элементом в снимке

public void listOfUsers(final ICallBackPeople iCallBackPeople) {

        peopleModelList = new ArrayList<>();

        registrationReference.child(userId).child("generated_links").addListenerForSingleValueEvent(new ValueEventListener()
        {
            PeopleModel peopleModel;
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                peopleModelList.clear();

                for(final DataSnapshot snapshot : dataSnapshot.getChildren())
                {
                    peopleModel = new PeopleModel();

                    peopleHashMap =(HashMap)snapshot.getValue();

                    peopleModel.setChatWith((String)peopleHashMap.get("chatWith"));
                    peopleModel.setNickname((String)peopleHashMap.get("nickname"));
                    peopleModel.setChatRoom(snapshot.getKey());


                    if(peopleModel.getChatWith()!=null && !("".equals(peopleModel.getChatWith())))
                    {
                        getToken(new CallBackGetToken() {
                            @Override
                            public void token(String token) {
                                peopleModel.setRefresh_token(token);
                                Toast.makeText(context, token, Toast.LENGTH_SHORT).show();
                                peopleModelList.add(peopleModel);

                                //here i am checking my peopleModelList size is equal or not to snapshot
                                if(peopleModelList.size()==2)
                                    iCallBackPeople.peopleAct(peopleModelList);
                            }
                        },peopleModel);
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }

    private void getToken(final CallBackGetToken callBackGetToken ,PeopleModel peopleModel) {
        registrationReference.child(peopleModel.getChatWith()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                callBackGetToken.token((String)dataSnapshot.child("refresh_token").getValue());
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
    }

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Вот мое решение:

int count =0;

SortedMap<Integer,PeopleModel> sortedMap;
private void set() {
     count =0;
    registrationReference.child(userId).child("generated_links").addListenerForSingleValueEvent(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            peopleModelList.clear();
            sortedMap = new TreeMap<>();
            for(DataSnapshot snapshot : dataSnapshot.getChildren())
            {
                peopleModel = new PeopleModel();

                peopleHashMap =(HashMap)snapshot.getValue();

                peopleModel.setChatWith((String)peopleHashMap.get("chatWith"));
                peopleModel.setNickname((String)peopleHashMap.get("nickname"));
                peopleModel.setChatRoom(snapshot.getKey());

                Log.d("kkkk","1st");

                if(peopleModel.getChatWith()!=null && !("".equals(peopleModel.getChatWith())))
                {
                    addItem(count);
                    count++;
                }
                Log.d("kkkk","3rd");

            }
            iCallBackPeople.peopleAct(peopleModelList);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

private void addItem(final int index) {
    registrationReference.child(peopleModel.getChatWith()).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            peopleModel.setRefresh_token((String)dataSnapshot.child("refresh_token").getValue());
            Log.d("kkkk","2nd");
            sortedMap.put(index, peopleModel);
            // sortedMap will sort your list by key (in this case, key is integer)
            // you can get peopleModelList = new ArrayList<>(sortedMap.values);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}
0 голосов
/ 01 мая 2018

Может быть, я слишком упрощаю это, но я чувствую, что вы должны просто использовать простую рекурсию.

List<People> peopleList;
int currentIndex = 0

private void myFirebaseMethodAction(person){
     registerListener.onCallbacks(new ValueListener(){
             onDataChanged(){
                  person.addStufforDoStuff();
                  if(peopleList.size > currentIndex + 1){
                      myFirebaseMethodAction(peopleList.get(++currentIndex)
                  }
             }
             onFailed(){
                  //handle it
             }
     }
}

Имеет ли это смысл?Просто сказать, пройтись по списку с индексом, просто.Кстати, выше псевдо-код, не копируйте дословно lol.

0 голосов
/ 26 апреля 2018

Я думаю, вы должны пройти через интерфейс (создать его и реализовать в этом классе).метод внутри интерфейса должен иметь строку в качестве параметра (он получит ваш peopleModel.getChatWith () ).

Внутри вашего if(peopleModel.getChatWith()!=null && !("".equals(peopleModel.getChatWith()))) вы должны запросить ваш интерфейс.

Я думаю, что это решение вашего асинхронного вопроса.

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