【问题标题】:android - Firebase return null value from datasnapshot Why?android - Firebase 从数据快照返回空值为什么?
【发布时间】:2017-07-15 17:37:57
【问题描述】:

以下代码被截断后,我遇到了一些麻烦:

mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void  onDataChange(DataSnapshot dataSnapshot) {
        size = (int) dataSnapshot.getChildrenCount();   
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});
viewHolder.setCount(size);

大小返回 null 但我不明白为什么。我想将计数值传递给 recyclerview。

【问题讨论】:

  • 发布您的数据库结构以及 mCevap 是什么
  • 这是我想要返回的“尺寸”。但是你不断地转向零。如果我用'Toast'打印它,它会正常反映。

标签: android firebase firebase-realtime-database


【解决方案1】:

数据是从 Firebase 异步加载的。这意味着您的代码执行顺序可能不是您所期望的。您可以通过在代码中添加一些日志语句来最轻松地看到这一点:

System.out.println("Before addListenerForSingleValueEvent");
mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void  onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("In onDataChange");
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});
System.out.println("After addListenerForSingleValueEvent");

这个的输出是:

在 addListenerForSingleValueEvent 之前

addListenerForSingleValueEvent 之后

在 onDataChange 中

这可能不是您所期望的!数据是从 Firebase 异步加载的。而不是等待它返回(这将导致“应用程序无响应”对话框),该方法继续。然后当数据可用时,您的onDataChange 会被调用。

要使程序正常工作,您需要将需要数据的代码移入onDataChange方法:

mCevap.child(post_key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void  onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("size ="+dataSnapshot.getChildrenCount());
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});

【讨论】:

  • 我怎样才能将它传输到 RecycleView 中的 TextView。
猜你喜欢
  • 1970-01-01
  • 2021-07-03
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
相关资源
最近更新 更多