我正在创建测验应用程序。应用程序中的问题基于一些不断变化的值。因此,我使用 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/