我有以下代码:

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/

10-13 04:56