我有这个功能:
public String checkOnline(String fId) {
DatabaseReference onlineUser = FirebaseDatabase.getInstance().getReference().child("online").child(fId);
onlineUser.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Online post = dataSnapshot.getValue(Online.class);
uOnline = post.timestamp;
different = getDate().getTime() - uOnline;
different = TimeUnit.MILLISECONDS.toMinutes(different);
if(different < 1){
ifOnline = "donline.setVisibility(View.VISIBLE);";
} else {
ifOnline = "donline.setVisibility(View.GONE);";
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
return ifOnline;
}
ifOnline是一个字符串
我调用checkOnline函数并为每个用户执行该函数并获取两个语句(当然每个用户都有1个)。
问题是checkOnline返回null,即使语句执行得很好。问题出在哪儿?是因为onDataChange无效吗?
我不知道问题出在哪里,因为ifOnline是该类的私有,因此只要它被赋值给它就应该返回当前值..
添加了数据结构:
在线数据库结构:
Online -> userId: status (string)
timestamp (long)
答案 0 :(得分:1)
正如您现在知道onDataChange()
是异步执行的,因此我建议make checkOnline(String fId)
返回void并在checkOnlineResponse(ifOnline)
中调用onDataChange()
之类的函数并执行其余的操作checkOnlineResponse(ifOnline)
函数中的逻辑。
希望它有所帮助。
答案 1 :(得分:0)
这是因为异步调用onDataChange并且在调用onDataChange之前执行语句return ifOnline
。当然,前提是您的数据库一切正常。