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