我有以下代码:
ViewThreeObserver observer = my_view.getViewTreeObserver();
observer.addOnScrollChangedListener(new OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if(condition) {
//do something
}
}
});
现在,如果条件得到验证,我将在观察者上删除侦听器。
我尝试过:
observer.addOnScrollChangedListener(null);
但是我收到一个错误,声称“ ViewThreeObserver尚未运行”。这是什么意思,以及如何正确删除监听器?
最佳答案
observer
是一个长期引用,不能保证在视图的生存期内有效。相反,您可以再次在视图上调用getViewTreeObserver
并删除侦听器(使用Ahmad提到的removeOnScrollChangedListener)。
my_view.getViewTreeObserver().removeOnScrollChangedListener(this);
尽管这是一个短暂的通话,但它可能还没有激活,因此您可以事先检查isAlive(我自己从未经历过)。
如果愿意,您还可以在
isAlive
上使用observer
(很可能不会运行),并使用它删除监听器。如果observer
仍然存在,则仍然需要致电getViewTreeObserver
。引用getViewTreeObserver
返回此视图的层次结构的ViewTreeObserver。视图树
当全局事件(例如,
布局,发生。返回的ViewTreeObserver观察者不是
保证在此视图的生命周期内保持有效。如果
此方法的调用者保留了对它的长期引用
ViewTreeObserver,它应始终检查的返回值
活着()。
我已经看到了许多不同的变化,这里有一些:
Without checking isAlive
Checking isAlive on short-lived call
关于android - 从ViewThreeObserver移除OnScrollChangedListener,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23313618/