Firebase отправляет данные в одном действии и извлекает данные в другом действии

У меня есть три действия «Регистрация», «Войти» и «Главная». Когда пользователь вводит свои регистрационные данные, я отправляю идентификатор электронной почты в базу данных firebase после успешной регистрации. Данные пользователя успешно отправлены. Теперь открывается MainActivity Foll - это код в моем RegisterActivity

mFirebaseDatabase = FirebaseDatabase.getInstance();
mMessagesDatabaseReference = mFirebaseDatabase.getReference().child("loginusers");
firebaseAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){
                        Toast.makeText(RegisterActivity.this,"Registration Success",Toast.LENGTH_LONG).show();
                        saveDisplayName();

                        User user = new User(email);
                        mMessagesDatabaseReference.push().setValue(user);
    ......}

Теперь я хочу получить всех пользователей, которые зарегистрированы в моем ArrayList MainActivitie. Итак, я написал следующий код в своей MainActivity

 mFirebaseDatabase = FirebaseDatabase.getInstance();
        mMessagesDatabaseReference = mFirebaseDatabase.getReference().child("loginusers");
 mMessagesDatabaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                contactList.clear();
                for (DataSnapshot postSnapshot : snapshot.getChildren()) {

                    User user = postSnapshot.getValue(User.class);
                    if(!contactList.contains(user)){
                        contactList.add(user);


                    }

                }
                for(int i=0;i<contactList.size();i++){
                    Toast.makeText(getApplicationContext(),"Hi"+contactList.get(i),Toast.LENGTH_SHORT).show();
                    Log.i("Pritish", "onDataChange: "+contactList.get(i));
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {



            }
        });

но этот метод никогда не вызывается. Теперь я знаю, что могу написать код, написанный в моей MainActivity, в RegisterActivity, а затем передать список пользователей с помощью Intent, но я не хочу этого делать, поскольку это может создать проблему, если пользователь использует LoginActivity. Пожалуйста помоги


person hagrya    schedule 02.10.2017    source источник
comment
Вы сделали вариант выхода из системы в своем приложении? если опция выхода из системы, то вы сначала устанавливаете флаг регистрации пользователя в sharedprefrence, а также устанавливаете флаг входа в систему в shared prefrence.   -  person Vij    schedule 02.10.2017
comment
Не понял тебя. Я не реализовал функцию выхода из системы   -  person hagrya    schedule 02.10.2017


Ответы (1)


Чтобы решить эту проблему, вам нужно объявить и использовать contactList в методе onDataChange(), иначе он всегда будет null из-за асинхронного поведения этих методов, которые вызываются еще до того, как вы добавляете эти объекты в список. Итак, ваш код должен выглядеть так:

mMessagesDatabaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            List<User> contactList = new ArrayList<>();

            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                User user = postSnapshot.getValue(User.class);
                if(!contactList.contains(user)){
                    contactList.add(user);
                }
            }
            for(int i=0;i<contactList.size();i++){
                Toast.makeText(getApplicationContext(),"Hi"+contactList.get(i),Toast.LENGTH_SHORT).show();
                Log.i("Pritish", "onDataChange: "+contactList.get(i));
            }
        }

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

Если вы хотите использовать значение этой строки вне этого метода, взгляните на мой ответ из этого опубликовать.

person Alex Mamo    schedule 02.10.2017