Почему эти ValueEventListeners не срабатывают при добавлении значения? - PullRequest
0 голосов
/ 31 августа 2018

Код выглядит так:

final DatabaseReference TuidRef = usersRef.child(td);
        final DatabaseReference msgRef = TuidRef.child("rec_msg");
        final DatabaseReference FuidRef = TuidRef.child("fromUID");
        final DatabaseReference secretRef = TuidRef.child("rec_secret");


        msgRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
                ms = dataSnapshot1.getValue(String.class);
                flag++;

            }

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

            }
        });

        FuidRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                fUid = dataSnapshot2.getValue(String.class);
                flag++;
            }

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

            }
        });

        secretRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
                st = dataSnapshot3.getValue(String.class);
                flag++;

            }

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

            }
        });

        String flagS = "" + flag;
        Log.i("flag",flagS);
        if(flag > 2)
            displayMessage();

Я использовал флаг, чтобы узнать, сколько раз срабатывает ValueEventListeners, но в журнале установлено, что флаг равен 0.

td - это uid человека, получившего сообщение. На рисунке ниже он совпадает с родительским ключом других братьев и сестер.

База данных выглядит примерно так, когда нет сообщений: image1

База данных выглядит следующим образом при получении сообщений: image2

Редактировать: Как я могу выполнить функцию displayMessage(), когда все три слушателя были запущены одновременно?

Значение добавляется одновременно ко всем трем в базе данных firebase.

1 Ответ

0 голосов
/ 31 августа 2018

Вы никогда не узнаете, сколько раз срабатывает ValueEventListeners, как это происходит, потому что значение flag всегда будет оставаться 0. Это происходит из-за асинхронного поведения метода onDataChange(), который вызывается еще до того, как вы пытаетесь получить данные из базы данных. Что действительно происходит, так это то, что вы пытаетесь получить данные из базы данных и сразу же попытаетесь записать их, в то время как переменная flag имеет начальное значение 0. Затем, когда получение данных из базы данных завершается, оно меняет значение флага, но никогда больше не читается.

Быстрое решение этой проблемы - добавить три разных флага внутри каждого обратного вызова и попытаться выполнить вход отдельно, только внутри метода onDataChange(), например:

msgRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
        ms = dataSnapshot1.getValue(String.class);
        flag1++;
        Log.i("flag1", String.valueOf(flag1));
    }

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

FuidRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
        fUid = dataSnapshot2.getValue(String.class);
        flag2++;
        Log.i("flag2", String.valueOf(flag2));
    }

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

secretRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
        st = dataSnapshot3.getValue(String.class);
        flag3++;
        Log.i("flag3", String.valueOf(flag3));
    }

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

Если вам нужно в своем коде получить значение этого флага вне метода onDataChange(), я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором Я объяснил, как это можно сделать с помощью пользовательского обратного вызова. Вы также можете взглянуть на это видео для лучшего понимания.

Edit:

msgRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
        ms = dataSnapshot1.getValue(String.class);
        flag++;

        FuidRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                fUid = dataSnapshot2.getValue(String.class);
                flag++;

                secretRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
                        st = dataSnapshot3.getValue(String.class);
                        flag++;
                        Log.i("flag", String.valueOf(flag));
                    }

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

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

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...