Firebase onDataChange返回null值

时间:2017-04-24 17:06:00

标签: android firebase firebase-realtime-database

我有这个功能:

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)

2 个答案:

答案 0 :(得分:1)

正如您现在知道onDataChange()是异步执行的,因此我建议make checkOnline(String fId)返回void并在checkOnlineResponse(ifOnline)中调用onDataChange()之类的函数并执行其余的操作checkOnlineResponse(ifOnline)函数中的逻辑。 希望它有所帮助。

答案 1 :(得分:0)

这是因为异步调用onDataChange并且在调用onDataChange之前执行语句return ifOnline。当然,前提是您的数据库一切正常。