Firebase值事件侦听器无法正常工作

时间:2017-04-10 21:51:45

标签: android firebase firebase-realtime-database

在我的应用程序中,我有一个id应该从firebase实时数据库中下载。如果我把它拉下来并且它看到没有可用的id,那么它将id设置为1.我做了一个调试,并且id设置为1,但是在监听器完成之后,id变为0.我不知道#39;不知道为什么或导致这种情况的原因,但这是我的代码。

听众代码:

userRef.child("id").

addSingleValueEventListener(new ValueEventListener() {
    @Override public void onDataChange (DataSnapshot dataSnapshot){
        try {
            String value = dataSnapshot.getValue().toString();
            id = Integer.parseInt(value);
        } catch (NullPointerException e) {
            id = 1;  //After this, id is 1
            e.printStackTrace();
        }
    }

    @Override public void onCancelled (DatabaseError databaseError){
        id = 1;
    }
}); //Now id is 0

3 个答案:

答案 0 :(得分:6)

这个问题有两个问题,一个关于Firebase监听器,第二个关于删除多余的代码。

Firebase侦听器的一个基本要素是它们是异步,这意味着您的代码在执行下一行之前不会等待结果。请查看此框架代码中的注释:

userRef.child("id").
addSingleValueEventListener(new ValueEventListener() {
    @Override public void onDataChange (DataSnapshot dataSnapshot){
        // code here does not get executed straight away,
        // it gets executed whenever data is received back from the remote database
    }

    @Override public void onCancelled (DatabaseError databaseError){

    }
});
// if you have a line of code here immediately after adding the listener
// the onDataChange code *won't have run*. You go straight to these lines
// of code, the onDataChange method will run whenever it's ready.

所以这意味着如果你想对onDataChange中的数据做些什么,你应该把这些代码放在onDataChange方法中(或从那里或其他一些方法调用的其他方法)在数据交付之后运行该代码的方式。)

关于第二部分,稍微更多的 Firebasey 检查是否存在int并获取值的方法是:

@Override public void onDataChange (DataSnapshot dataSnapshot){
    if (dataSnapshot.exists()) {
        id = dataSnapshot.getValue(Integer.class);
    } else {
        id = 1;
    }
}

答案 1 :(得分:0)

你需要使用setValue()将id = 1设置到firebase数据库中,尝试下面的代码行可以帮助你

   userRef.child("id").

  addSingleValueEventListener(new ValueEventListener() {
@Override public void onDataChange (DataSnapshot dataSnapshot){
    try {
        String value = dataSnapshot.getValue().toString();
        id = Integer.parseInt(value);
    } catch (NullPointerException e) {
         // if id=0 then set id=1 using setvalue()
        // this will set value of Id =1 in firebase database 
             id=1;                 
        userRef.child("id").setValue(id);
        log.d(LOG_TAG, e.printStackTrace());
    }
}

@Override public void onCancelled (DatabaseError databaseError){
            id=1;
          userRef.child("id").setValue(id);
   }
}); 

答案 2 :(得分:0)

从FireBase实时数据库中取出对象时,我遇到了同样的问题, 就像@Lewis McGeary所写的那样,我只是让我的程序等待,直到从数据库中检索了所有数据

这是我的示例代码:

BarReference = FirebaseDatabase.getInstance().getReference("Users").child(myUID);
ValueEventListener UserChangeListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        me = dataSnapshot.getValue(UserDataSet.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    }
};
BarReference.addValueEventListener(UserChangeListener);
while (me == null){
   Log.w(TAG, "Waiting For The Data to Download");
   progresBar.setVisibility(View.VISIBLE);
   return;
}

希望有帮助! (^_^)