java - 如何限制Firestore中添加和删除监听器的数量?

标签 java android firebase google-cloud-firestore

我正在创建测验应用程序。应用程序中的问题基于一些不断变化的值。因此,我使用 addSnapshotListener() 来获取数据库中所做的每个更改。 docs仍然是我应该删除监听器,这很好,但问题是在我的应用程序中,方向经常改变。这意味着我附加和删除监听器的次数过多。这是一个不好的方法吗?怎么解决这个问题?

最佳答案

Is this a bad approach?

不,不是!一旦不再需要监听器,您绝对应该将其删除。我假设您在 Activity 的 onStart() 方法中添加监听器,并在 Activity 的 onStop() 方法中删除它,对吗?如果是这样,请注意这是正常行为,因为这两种方法都是 Activity 生命周期的一部分,并且每次方向更改时都会被调用。因此,每次发生重新定向时, Activity 都会被销毁并再次重新创建。请查看更多信息:

如果您想要一种更优雅的方式来删除监听器,您应该从这个 post 中看到我答案的最后部分。 。因此,您可以将 Activity 作为 addSnapshotListener() 中的第一个参数传递。方法和监听器将自动为您删除。

编辑:

根据你的评论,你是对的。即使您使用该解决方案,附加和删除监听器的数量也是相同的。在这种情况下,我有一个解决方案可以减少这个数字。

private boolean pending = false;
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //Remove listener
        pending = false;
    }
};

@Override
protected void onStart() {
    super.onStart();
    if (pending) {
        handler.removeCallbacks(runnable);
    } else {
        //Attach listener
    }
    pending = false;
}

@Override
protected void onStop() {
    super.onStop();
    handler.postDelayed(runnable, 3000);
    pending = true;
}

这基本上意味着 Handler 将通过使用 Runnable 回调安排监听器的删除,该回调将在调用 三秒后实际执行删除>onStop()。我已将方向更改的延迟设置为三秒,但在现实情况下,即使在旧手机上,它通常也会快得多。

因此,如果方向快于这三秒,我们只需删除回调并允许监听器继续监听。这显然意味着您减少了删除监听器的次数。

这也非常有用,因为即使结果没有改变,也不会在 Firestore 后端之间进行第二次往返来获取数据。

关于java - 如何限制Firestore中添加和删除监听器的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54594070/

相关文章:

Java连接线程池和连接工厂?

java - 有人可以解释一下这个 switch 语句的行为吗?

javascript - 重定向在 springboot Controller 中不起作用

java - 图像处理应用程序的内存使用情况

javascript - Firebase firestore 云函数显示错误 : Invalid use of type "undefined" as a Firestore argument

java - Camera2 API 仅适用于前 5 张图片

java - 无法读取 rss XML,使用简单 XML 和 Retrofit

android - 带边框的 View

angularjs - 当应用程序在后台时暂停 firebase 连接

javascript - 我可以将 .then() 与 firebaseListObservable 一起使用吗,即 this.items = query 和 .then()