0
  • 最佳答案

    我觉得setXXXListener与addXXXListener主要考察是经验。为什么呢?


    我记得以前的ListView一开始是设置item的点击监听,后面改成了添加item的监听。并且注解设置item的点击监听为过时的。


    有以新手同学以为是命名不好,所以从setOnItemClickListener改成addOnItemClickListener,其实不然。


    这两者的实现完全不一样。


    setXxxListener是把一个监听者设置成一个成员变量,也就是说,被监听的对象只持有一个监听者。如果需要释放资源,直接setXxxListener(null)即可。


    addXxxListener则里被监听者的内部有一个集合用于保存各路监听者,需要管理起来。如果不使用了,取消注册,所以添加removeXxxxListener的方法。当实践分发的时候,遍历集合,然后进行通知即可。


    当只有一个地方需要监听的时候,只需要setXxxListener集合,如果有多个地方需要监听则设计成addXxxxListener,比如说播放器的状态,如果多个页面需要知道的话,那么我们设计成add的方式。


    1153952789488054272  评论     打赏       拉大锯
    • 实际上,在使用一些框架或者原生的一些组件会出现这个问题,比如说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是不好办这个事情的。

      1195567795522260992  评论     打赏       ls666
      • 具体的区别不太了解,但是一路跟着学下来,发现setxxxlistener一般只有一个事件,addxxxlistener基本上有3个事件,add在反复调用时应该是同一个监听吧,不知道set反复调用时,会不会覆盖前一个事件

        1268774545783795712  评论     打赏       ALEX
        • 拉大锯  回复 @ALEX
          有代码经验,属于初学者阶段,但是还没有了解回调吧?那你有没有办法解决你现在的疑问呢?
          拉大锯 2020-10-31 16:54   回复 1153952789488054272
      • 同一控件有两个setXxxListener只会执行第二个,第一个被覆盖。addXxxxListener则两个都会执行

        1248043264225841152  评论     打赏       JERRY·轩
        • 拉大锯  回复 @JERRY·轩
          不一定是控件呀,就是监听者嘛,就是个说话,哈哈。你应该理解的,但是你的表达,你的说法不对。
          拉大锯 2020-10-31 17:27   回复 1153952789488054272
      相关问题
      幻影~ · 安卓
      2024-04-26 19:25 10 4
      deanhu · AOSP
      2024-04-25 21:53 3 10
      幻影~ · 提问
      2024-04-13 20:13 10 2
      幻影~ · 找工作
      2024-04-07 10:44 18 2
      幻影~ · 问题
      2024-03-31 17:20 7 2
      TONYGFX · AOSP
      2024-03-28 17:11 4 2