Não é possível obter o valor de retorno de um método que recupera dados do banco de dados Firebase Realtime para usá-lo na seguinte linha de código [duplicado]

Esta pergunta já tem uma resposta aqui:

Como retornar o valor DataSnapshot como resultado de um métod 3 respostas

Sou bastante novo no banco de dados Firebase Realtime. Estou trabalhando em um aplicativo Android que requer que os dados sejam recuperados do Firebase Realtime DB. Consegui recuperar dados usando os métodos de ouvinte do Firebase na maioria das ocasiões, mas em uma ocasião, achei incapaz de obter um valor da maneira que desejo (acho que devido à natureza assíncrona).

CENÁRIO:

Tenho uma estrutura de dados no Firebase Realtime Database da seguinte forma:

Para classificação:

Para usuários:

Tenho uma classe java separada (Suggest.java) que possui um método simples para obter uma lista de usuários (não mostrada aqui por ser a implementação básica) e o método definido abaixo para recuperar dados do nó de classificação acima em uma lista :

public List<String> getMyUnratedPosts(final String currentUserId){
    final List<String> currentUserUnratedPosts = new ArrayList<>();
    DBRCurrentUnratedList = FirebaseDatabase.getInstance().getReference().child("adRat").child(currentUserId);
    DBRCurrentUnratedList.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                AdRat adr = snapshot.getValue(AdRat.class);
                int vr = adr.getViewRating();
                if(vr < 1) {
                    currentUserUnratedPosts.add(adr.getAdId());
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
    return currentUserUnratedPosts;
}

A classe AdRat definida acima é apenas uma classe com atributos (e getters e setters) que correspondem ao nó do banco de dados fornecido acim

Estou criando uma instância desta classe (Suggest.java) no método onCreate () da minha atividade. Primeiro, estou chamando um método no qual estou simplesmente obtendo uma lista de usuários (muito semelhante ao método acima, no qual recebo as classificações). Em seguida, na próxima linha de código da minha atividade, uso um loop for para obter cada usuário da lista que obtive e usar esse userId para o método mostrado acima. Por exemplo, seria o seguinte:

Suggest sj = new Suggest();
List<String> users = sj.getUsers();
for (final String mUser: users) {                 
    //Just trying to use the user from above here
    List<String> myUnratedItems = sj.getMyUnratedPosts(mUser);
    Log.d(TAG, "list contains : " + myUnratedItems.toString());
}

PROBLEM: -

Não obtenho o resultado pretendido do código quando executo isso. Quando eu depurar, ficarei nulo para a lista de usuários. Eu acho que, como os métodos do firebase são assíncronos, eles não fornecem o resultado exatamente na próxima linha de código (que é o local em que eu preciso), mas fornecem o resultado um pouco mais tarde (mas o programa foi executado na linha de código em que preciso desses dados).

MY NECESSIDADE GERAL: -

Obtenha a lista de usuários para usá-lo na próxima linha de código (para o próximo método

Passei por várias perguntas no Stackoverflow em relação a isso, mas não consegui encontrar uma resposta exata para isso.

Por favor, explique por que isso acontece e qualquer solução alternativa para isso ....

P.S. : - Eu sou novo no stackoverflow, portanto, tenha em consideração todos os erros cometidos na composição da pergunta. Obrigado

questionAnswers(2)

yourAnswerToTheQuestion