Android / Firebase - 在onDataChange中设置变量

时间:2017-11-21 13:49:24

标签: android firebase

我正在尝试在onDataChange()方法中设置一个变量,然后根据此变量的值做不同的事情,但似乎我的应用程序没有等待方法完成。

这是我的代码:

@Override
public String onConfirm(final String s, final String s1)
{
    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    final DatabaseReference[] ref = {database.getReference("/users/")};
    final boolean[] correct = {false};

    ref[0].addListenerForSingleValueEvent(new ValueEventListener()
    {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            if (dataSnapshot.hasChild(convertEmail(s.replaceFirst("\\s++$", ""))))
            {
                String correctPasswd = dataSnapshot.child(convertEmail(s.replaceFirst("\\s++$", ""))).child("password").getValue(String.class);
                if (correctPasswd != null && s1.matches(correctPasswd))
                    correct[0] = true;
                // THE VARIABLE IS SET RIGHT HERE
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError)
        {

        }
    });

    //AND I WANT TO USE IT RIGHT HERE
    if (correct[0])
        return null;
    else
        return "Your email address or your password is incorrect.";
}

那我该怎么办?

2 个答案:

答案 0 :(得分:0)

 @Override
        public void onDataChange(DataSnapshot dataSnapshot)
        {
            if (dataSnapshot.hasChild(convertEmail(s.replaceFirst("\\s++$", ""))))
            {
                String correctPasswd = dataSnapshot.child(convertEmail(s.replaceFirst("\\s++$", ""))).child("password").getValue(String.class);
                if (correctPasswd != null && s1.matches(correctPasswd))
                    correct[0] = true;
                // Can use Events/EventBus or can sendBroadCast() with data {correct[0]}
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError)
        {

        }
    });

答案 1 :(得分:0)

您不能简单地在correct[0]方法之外使用onDataChange()。由于它的异步行为,它始终是null。简短的答案是成员变量,但是在onDataChange()方法实际分配它之前它将为空(如果没有网络连接,则可能永远不会)。因此,在您尝试分配correct[0] = true;之前,系统会调用此方法。

因此,为了解决这个问题,您需要在onDataChange()方法中执行逻辑。换句话说,在该方法中移动if statement。如果您想在onDataChange()方法之外使用该值,请从此post阅读我的答案。