Firebase在一个活动中推送数据并在另一个活动中检索数据

时间:2017-10-02 06:03:17

标签: android firebase firebase-realtime-database

我有三个活动注册,登录和主要。当用户输入他的注册详细信息时,我在成功注册后将电子邮件ID推送到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);
    ......}

现在我想检索在MainActivitie的ArrayList中注册的所有用户。所以我在我的MainActivity中编写了foll代码

 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) {



            }
        });

但这种方法永远不会被调用。现在我知道我可以在RegisterActivity中编写我的MainActivity中编写的代码,然后使用Intent传递用户列表,但我不想这样做,因为如果用户使用LoginActivity,它可能会产生问题。 请帮忙

1 个答案:

答案 0 :(得分: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) {}
});

如果您想在该方法之外使用该字符串的值,请从post查看我的答案。