【问题标题】:Firebase - view.setText() - How to wait for responseFirebase - view.setText() - 如何等待响应
【发布时间】:2016-07-03 03:02:26
【问题描述】:

我使用 Firebase 在数据库中保存一些用户控制文本。我通常会收到一个空指针异常,因为最初没有触发 onDataChange。 (我使用 ValueEventListener)

我该如何解决这个问题?

来电:

sharedPref = FirebaseDatabase.getInstance().getReference().child("abc").child("ddd");

            ValueEventListener clubSettingsListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    firebaseClubSettingsModel = dataSnapshot.getValue(FirebaseClubSettingsModel.class);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    Log.w("ClubSettingsService", "loadPost:onCancelled", databaseError.toException());
                }
            };

            sharedPref.addValueEventListener(clubSettingsListener);

            if (firebaseClubSettingsModel == null) {
                firebaseClubSettingsModel = new FirebaseClubSettingsModel();
                //sharedPref.setValue(firebaseClubSettingsModel);
            }

【问题讨论】:

  • 请附上电话,以便我们清楚地了解您的问题
  • 我编辑了帖子。

标签: firebase firebase-realtime-database


【解决方案1】:

您无法在 onDataChange 事件之外操作数据,因为从 firebase 获取数据是一个异步过程,因此无法保证在您检查其值时调用会结束。

您必须在 onDataChange 侦听器中执行验证和其他逻辑,因为它会在数据可用时立即触发。

sharedPref = FirebaseDatabase.getInstance().getReference().child("abc").child("ddd");

ValueEventListener clubSettingsListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        firebaseClubSettingsModel = dataSnapshot.getValue(FirebaseClubSettingsModel.class);
        if (firebaseClubSettingsModel == null) {
            firebaseClubSettingsModel = new FirebaseClubSettingsModel();
            sharedPref.setValue(firebaseClubSettingsModel);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.w("ClubSettingsService", "loadPost:onCancelled", databaseError.toException());
    }
};
sharedPref.addValueEventListener(clubSettingsListener);

【讨论】:

  • 是否可以等到数据可用?也许有闪屏?
  • 数据可用是什么意思?如果onDataChange被触发则数据可用
  • 更简单的用例:我有一个按钮。按钮文本位于 firebase 数据库中。如果我向用户显示视图,他看不到按钮文本。可以显示默认文本(我有带有默认文本的模型),但这不是一个好的解决方案。
  • @thomas 我认为您不必担心显示视图与文本可用并显示在按钮中之间的延迟,因为 firebase 几乎没有延迟。如果您真的想继续这样做,您可以在打开视图时启动加载微调器,然后在触发 onDataChange 时立即将其关闭。
  • 我认为,这就是解决方案。因为这里有很多延迟(不仅仅是4G)
猜你喜欢
  • 2021-10-16
  • 1970-01-01
  • 2022-07-01
  • 2019-06-04
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 2020-03-07
相关资源
最近更新 更多