我正在尝试在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.";
}
那我该怎么办?
答案 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阅读我的答案。