addXxxxListener与setXxxxListener的区别是什么呢?
考察一下工作经验
您的每一个用心回答,都会让这个世界变得更美好一些!
我觉得setXXXListener与addXXXListener主要考察是经验。为什么呢?
我记得以前的ListView一开始是设置item的点击监听,后面改成了添加item的监听。并且注解设置item的点击监听为过时的。
有以新手同学以为是命名不好,所以从setOnItemClickListener改成addOnItemClickListener,其实不然。
这两者的实现完全不一样。
setXxxListener是把一个监听者设置成一个成员变量,也就是说,被监听的对象只持有一个监听者。如果需要释放资源,直接setXxxListener(null)即可。
addXxxListener则里被监听者的内部有一个集合用于保存各路监听者,需要管理起来。如果不使用了,取消注册,所以添加removeXxxxListener的方法。当实践分发的时候,遍历集合,然后进行通知即可。
当只有一个地方需要监听的时候,只需要setXxxListener集合,如果有多个地方需要监听则设计成addXxxxListener,比如说播放器的状态,如果多个页面需要知道的话,那么我们设计成add的方式。
实际上,在使用一些框架或者原生的一些组件会出现这个问题,比如说viewPager的setOnPageChangeListener和addOnPageChangeListener。
在查看源码的时候可以发现addOnPageChangeListener是往一个List里面去add,一个viewPager可以有很多个Listener。但是set的话就是
@Deprecated public void setOnPageChangeListener(OnPageChangeListener listener) { mOnPageChangeListener = listener; }
public void addOnAdapterChangeListener(@NonNull OnAdapterChangeListener listener) { if (mAdapterChangeListeners == null) { mAdapterChangeListeners = new ArrayList<>(); } mAdapterChangeListeners.add(listener); }
目前发现的好处就是一个viewpager可以同时设置多个点击事件而不会被覆盖了,这种实现方式有很多应用场景,比如下面拉大锯提到的“比如说播放器的状态,如果多个页面需要知道的话,那么我们设计成add的方式。”
setListener是不好办这个事情的。
具体的区别不太了解,但是一路跟着学下来,发现setxxxlistener一般只有一个事件,addxxxlistener基本上有3个事件,add在反复调用时应该是同一个监听吧,不知道set反复调用时,会不会覆盖前一个事件
同一控件有两个setXxxListener只会执行第二个,第一个被覆盖。addXxxxListener则两个都会执行
我觉得setXXXListener与addXXXListener主要考察是经验。为什么呢?
我记得以前的ListView一开始是设置item的点击监听,后面改成了添加item的监听。并且注解设置item的点击监听为过时的。
有以新手同学以为是命名不好,所以从setOnItemClickListener改成addOnItemClickListener,其实不然。
这两者的实现完全不一样。
setXxxListener是把一个监听者设置成一个成员变量,也就是说,被监听的对象只持有一个监听者。如果需要释放资源,直接setXxxListener(null)即可。
addXxxListener则里被监听者的内部有一个集合用于保存各路监听者,需要管理起来。如果不使用了,取消注册,所以添加removeXxxxListener的方法。当实践分发的时候,遍历集合,然后进行通知即可。
当只有一个地方需要监听的时候,只需要setXxxListener集合,如果有多个地方需要监听则设计成addXxxxListener,比如说播放器的状态,如果多个页面需要知道的话,那么我们设计成add的方式。
实际上,在使用一些框架或者原生的一些组件会出现这个问题,比如说viewPager的setOnPageChangeListener和addOnPageChangeListener。
在查看源码的时候可以发现addOnPageChangeListener是往一个List里面去add,一个viewPager可以有很多个Listener。但是set的话就是
目前发现的好处就是一个viewpager可以同时设置多个点击事件而不会被覆盖了,这种实现方式有很多应用场景,比如下面拉大锯提到的“比如说播放器的状态,如果多个页面需要知道的话,那么我们设计成add的方式。”
setListener是不好办这个事情的。
具体的区别不太了解,但是一路跟着学下来,发现setxxxlistener一般只有一个事件,addxxxlistener基本上有3个事件,add在反复调用时应该是同一个监听吧,不知道set反复调用时,会不会覆盖前一个事件
同一控件有两个setXxxListener只会执行第二个,第一个被覆盖。addXxxxListener则两个都会执行