美文网首页Rx系列
Android_I Say No系列——RxBinding实现

Android_I Say No系列——RxBinding实现

作者: 鱼满楼 | 来源:发表于2017-04-27 08:26 被阅读238次

大神JakeWharton的系列开源库RxBinding深受开发者们的喜爱,在Github上已经有5200+的Star了。该库基于Rxjava开发,将View事件转化为Rxjava的流概念,非常新颖。然而要使用该库需要根据不同的控件引入不同的依赖,相当的烦。比如我只是特别想要使用Rxjava的throttleFirst操作符起到防抖动点击的作用而已。还是那句话,别人的库拥有太多我不需要的功能太过臃肿,那我还是实现一个属于自己的轻量级的RxBinding吧......


所以,大声的喊出来,I say no!我要自己写,我要用自己的!

实现

1、原理很简单但是也很绕,在Observable的create方法的内部类ObservableOnSubscribe里给view绑定监听,每次Click的时候,ObservableEmitter就发射一次【e.onNext(view)方法】,这样就完成了View事件对Rxjava流的转化;

2、使用泛型来控制下游所拿到的View类型方便一些View操作;

3、在封装的时候我更喜欢返回Observable类型因为这样在使用中非常的灵活方便定制化使用更多的操作符。

RxBinding的简单实现

使用

这时候我们就开开心心的使用起了throttleFirst操作符,亲测快速点击时候会屏蔽掉多余的点击;大家一定对上一步中在onDispose的时候把view的监听设为null感到多余,还记得在《Android_I Say No系列——项目框架(二)MVP_Rx订阅管理》里Presenter的封装bind方法么,detach的时候会统一把bind的订阅给dispose掉,上一步的doOnDispose里setOnClickListener(null)就是为了配合这一点。

RxBinding的简单使用

其实你不写doOnDispose里的setOnClickListener(null)也是不要紧的,但是我还是喜欢追求更完美一点的逻辑;性能优化就是一点一滴做的,就像之前在bind方法内部封装的add和remove那些已经完成的订阅,都是重在积累。


另类实现方式

这两天思考,RxBinding有没有其他实现方法,答案是Yes的。比如我自己想到的如下实现(这和第一种的实现原理完全不同,这种写法更像是Bus事件总线,bindClick通过比较View的id值来判断是否是当前View):

RxBinding的另类实现

另类使用方式

大家可能会喷起来了,这有什么鸟用?!!

非也非也,如果你的项目是在xml里定义的监听,又或者你使用了databinding技术在xml直接写了监听方法,那么直接使用第一种RxBinding技术就变成了监听里面绑监听,明显逻辑错误啊;这时,第二种binding方法就有用武之地了,而且用起来是不是也异常的爽:

RxBinding的另类使用

总结

本文中只列举了最普通的View.OnClickListener,对于其他的像View.OnLongClickListener等也是类似的写法,本文重在抛砖引玉。

思考不同的实现方式更加有利于学习与进步,以上两种方式都经过了实际测试,希望其他朋友提出更多的实现方式互相交流......


安卓开发交流:

有兴趣一起学习的朋友,请加Q群:76161364

相关文章

网友评论

  • W_BinaryTree:doOnDispose 最好成 e.setCancelable(() -> btn.setOnClickListener(null)); RxJava里 每一个操作符都会有新的Observable生成。还是越少越好。
    鱼满楼:@W_BinaryTree 非常感谢你的新思路,我之前都没这样想过。:smile:
  • 7e781f78621b:功能 抽离 ,思想不错 ,加油
    鱼满楼:@逍遥右 比较喜欢轻量级的东西:smile:
  • Wesley_杜:加油
    鱼满楼:@Wesley_杜 多谢鼓励:smiley:

本文标题:Android_I Say No系列——RxBinding实现

本文链接:https://www.haomeiwen.com/subject/hbnbzttx.html