2017-04-24 222 views
0

我有这样的功能:火力地堡onDataChange返回空值

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

请为我们提供您的数据库结构。 –

+0

请使用您的Firebase控制台将您的数据库结构下载为JSON文件。 –

+0

此函数使用1个json树对象,我提供的那个 – AlwaysConfused

回答

0

这是因为onDataChange异步调用,并声明return ifOnline是onDataChange被称为前执行。当然,只要你的数据库一切正常。

+0

那是怎么回事? onDataChange在checkOnline函数内部,所以onDataChange必须在checkOnline返回任何内容之前分配值? – AlwaysConfused

+0

不,'onDataChange'是'ValueEventListener'对象的一个​​方法,您将通过匿名类传递给'addValueEventListener'方法。 'ValueEventListener'将在数据库完成下载时调用'onDataChange'方法,并且所有这些都是异步执行的(在不同的线程中)。所以你不能依靠'onDataChange'将被调用,当你打电话'checkOnline' –

+0

你是对的。我已经实现了不同的代码,现在它工作正常。我完全摆脱了函数,并将onDataChange直接添加到checkOnline被调用的另一个函数中 – AlwaysConfused

0

请尝试使用此代码:

public String checkOnline(String fId) { 

    DatabaseReference onlineUser = FirebaseDatabase.getInstance().getReference().child("online").child(fId); 

    onlineUser.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
     Long post = dataSnapshot.child("timestamp").getValue(Long.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; 
} 

的问题是在这条线:Online post = dataSnapshot.getValue(Online.class);

你需要获得TimestampLong。希望能帮助到你。

+0

感谢您的支持,但这并没有什么不同,因为我从Online类 – AlwaysConfused

+1

噢,我现在明白了。在这种情况下'Dusan Jovanov'是正确的。 –

1

如u现在知道onDataChange()是异步执行的,所以我会建议让checkOnline(String fId)返回空隙,并呼吁像checkOnlineResponse(ifOnline)的函数onDataChange()并在checkOnlineResponse(ifOnline)功能来执行你的逻辑的其余部分。 希望它有帮助。