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

时间:2019-02-08 14:03:42

标签: java android firebase google-cloud-firestore

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

1 个答案:

答案 0 :(得分:3)

  

这是一个不好的方法吗?

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

如果您想以更优雅的方式删除监听器,则应从此 post 中查看答案的最后一部分。因此,您可以在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后端,以拉出数据。