大神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等也是类似的写法,本文重在抛砖引玉。
思考不同的实现方式更加有利于学习与进步,以上两种方式都经过了实际测试,希望其他朋友提出更多的实现方式互相交流......
网友评论