【问题标题】:Firebase onDataChange not called opening application after some timeFirebase onDataChange 一段时间后未调用打开应用程序
【发布时间】:2016-05-29 19:10:40
【问题描述】:

我正在使用 Firebase Api 9.+ 编写一个 Android 应用程序。

我使用 Firebase 身份验证和数据库。

当我访问我的应用程序并登录时,一切正常,并且 valueEventListeners 可以正确检索数据。

当我在一段时间后访问我的应用并且它已经登录时,我的问题就开始了。

身份验证似乎已得到确认,但我的任何侦听器都没有被触发,并且似乎没有任何内容被检索到。

要让我的应用程序再次正常工作,我必须退出并重新登录。

我不知道这是“会话过期”问题还是我忘记写在代码中的问题。

这是我的 valueEventListener 之一:

DatabaseReference myFirebase = FirebaseDatabase.getInstance().getReference();
hairDresserFirebase = myFirebase.getReference("hairDressers");
hairDresserFirebase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot : dataSnapshot.getChildren()){
            HairDresser hd = snapshot.getValue(HairDresser.class);
            if (hairDresserList.contains(hd)) hairDresserList.remove(hd);
            hairDresserList.add(hd);
        }
        mRecyclerView.getAdapter().notifyDataSetChanged();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
});

其他变化仅供参考。

它们都在不同片段的onCreateView()方法中。

这是在我的启动活动的 onCreate() 方法中执行的代码,用于验证用户是否已经登录:

mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if (user == null) return;
        authenticated = true;
    }
};

虽然我的登录活动仅在用户未登录并执行完整的正确程序以使用电子邮件和密码或使用 Facebook 登录时才会启动,但它工作正常。

我没有找到任何解决此问题的方法,我不想强​​迫我的用户每次打开我的应用程序时都重新进行身份验证。

请帮帮我:)

【问题讨论】:

  • 1. 能否请您添加 myFirebase 参考的减速? 2. 您是否调试过应用程序?您确定没有调用 onDataChangeonCancelled 吗?我建议在每个方法和每个 if 语句中添加 Log print,以便准确查看调用的内容和未调用的内容。
  • 1.我添加了声明。 2. 是的,我不止一次在各处添加了日志,但没有打印任何内容。
  • 我在使用 firebase:9.0.2 的电子邮件/密码身份验证时遇到了同样的问题。
  • 这个错误的任何解决方案?

标签: android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

您可能与 Firebase 失去联系。您可以通过在您的活动中运行此代码来监控连接来确认这一点:

 DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
    connectedRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            boolean connected = snapshot.getValue(Boolean.class);
            if (connected) {
                System.out.println("connected");
            } else {
                System.out.println("not connected");
            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            System.err.println("Listener was cancelled");
        }
    });

仅供参考 - Firebase 目前遇到了 android 身份验证问题,正在寻找解决方案。请参阅 Firebase 状态仪表板:https://status.firebase.google.com/incident/Authentication/16001

所以我建议您等到该问题得到解决。我也遇到了similar problem 并且在此期间不能真正做很多事情,但请稍等。 希望对您有所帮助。

【讨论】:

  • 谢谢,我试过你的代码,它打印“未连接”。您收到的结果是否相同?如果是这样,它可能真的是一个 Firebase 错误。如果没有,我的问题仍然存在。
  • 对我来说是同样的结果。我提交了一个错误报告。所以目前正在等待他们的回复。
  • Firebase 现在似乎工作正常,您的代码将我记录为“未连接”,知道会发生什么吗?
  • @Waza_Ba Firebase 不久前修复了这个问题。我建议您查看有关您的连接问题的最新线程。如果您的问题仍然存在,请尝试联系 Firebase 支持,他们会非常有帮助。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 2017-04-22
相关资源
最近更新 更多