Android - Использование значения переменной вне метода / слушателя, где оно принимает значение - PullRequest
0 голосов
/ 02 июня 2018

В настоящее время я занимаюсь школьным проектом android и мне нужна помощь. У меня есть переменная, которая принимает какое-то значение в слушателе базы данных, и мне нужно использовать это значение вне слушателя. Можете ли вы помочь мне найти способ исправить инициализацию и использоватьэта переменная. Спасибо. Мой код ниже

 DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("user");
            ref.addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Get map of users in datasnapshot

                           names= getAllNames((Map<String,Object>) dataSnapshot.getValue());

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            //handle databaseError
                        }
                    });
         String p=  names.get(1);

этот метод getAllNames работает нормально, я его протестировал .P в данном случае равен нулю, поскольку он использует f "names" вне слушателя, а переменная "names"проблема, но в слушателе показывает правильное значение.

1 Ответ

0 голосов
/ 02 июня 2018

Это против природы асинхронности.

Было бы лучше, если бы вы добавили следующий метод / логику в onDataChange вместо доступа к нему извне.

Однако вы можете сделать это с помощью Task

public Task<List<String>> getNames() {
TaskCompletionSource<String> task = new TaskCompletionSource<>();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("user");
            ref.addListenerForSingleValueEvent(
                    new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            //Get map of users in datasnapshot

                           task.setResult(getAllNames((Map<String,Object>) dataSnapshot.getValue()));

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {
                            //handle databaseError
                            task.setException(new RuntimeException());
                        }
                    });
    return task.getTask()

}

Теперь используйте его в своем методе:

Task<List<String>> task = getNames();
List<String> names = Tasks.await(task); // This will block till done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...