RxBinding解析,顺便模仿RxBinding做个RxAnimation

RxBinding 是一个对android View各种事件的扩展库,把各种view事件转为Observable事件流,使得可以对view事件使用rxjava的各种操作,同时也简化了代码。
.

本文重点:

1.常用的使用场景 (ps: 懂得直接跳过!)

2.要注意的点(比较重要)

3.RxBinding实现分析

4.模仿RxBinding做一个RxAnimation

.

常用的使用场景:

.
1.各种点击事件的去重, 在RxBinding没有出来之前,你可能在开发过程中会遇到这种情况, 比如说点击某个按钮跳转到一个新的Activity, 暂且叫它A吧, 那么你快速点击这个按钮两次,你会发现A创建了两个实例。坑啊!

RxBinding 极好的解决了这个问题!

RxView.clicks(xxButton)
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        startActivity(new Intent(MainActivity.this, A.class));
                    }
                });

RxAdapterView.itemClicks(listView)
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(new Action1<Void>() {
                    @Override
                    public void call(Void aVoid) {
                        startActivity(new Intent(MainActivity.this, A.class));
                    }
                });

.
2.使得代码更简洁,特别是各种View的接口,特别是多个方法的那种,我本来想以TextView为示例的,算了这个都满天飞了,换一个比如SeekBar的监听事件的接口,你可能只需要onProgressChanged(); 但是你不得不把另外两个方法实现!

Paste_Image.png
但是用了RxBinding,你只需要这样写!
//这里只传递了进度
RxSeekBar.changes(seekbar)
                .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                
            }
        })

3.RxBinding支持对点击事件的多次监听并且实现起来非常简单。RxBinding本身不能做到,但它与RxJava的操作方法结合可以做到,如:publish(), share(), replay()

Button b = (Button) v.findViewById(R.id.button);
Observable<Void> observable= RxView.clicks(b).share();

Subscription s = observable.subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                // do something
            }
        });
compositeSubscription.add(s);

Subscription s1 = observable.subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                // do something
            }
        });
compositeSubscription.add(s1);

4.各种View的常用事件,RxBinding都支持!, 还有appcompat-v7 ,design, 等等也都有单独的支持包!

Paste_Image.png

Paste_Image.png

.

要注意的点

RxBinding可能造成内存泄漏,所以最好手动取消订阅!
.

Subscription s1 = observable.subscribe(new Action1<Void>() {
            @Override
            public void call(Void aVoid) {
                // do something
            }
        });
compositeSubscription.add(s1);


//Acivity退出时 释放
Protected void OnDestory(){
    s1.unScribe();
}


或者使用RxLifeCycle, 这个库就是用来解决RxJava带来的内存泄漏!

如何使用readme里也比较清楚了。
地址: https://github.com/trello/RxLifecycle

RxBinding实现分析

RxBinding的实现其实比较简单: 借鉴一句话,就是语法糖,但是这糖真的好吃啊!!!

先说下大概的结构:

1.对用View的各种基础事件如点击事件,拖拽事件都是封装在RxView里的,类似的还有RxViewGroup
2. 对于某个View特有的事件封装在对应名称的类中,如RxTextView(TextWatcher), RxSeekBar, RxToolBar等等
3.对于各种单个参数的或者无参数的事件(如OnClickListener), 都封装为XXXXXOnSubscribe , 比如:ViewClickOnSubscribe
对于多个参数的事件都先把参数封装为xxxxEvent, 如:TextViewAfterTextChangeEvent

然后再封装一个XXXXOnSunscribe<xxxxEvent>, 这就等同于ViewClickOnSubscribe了:

你可能会问,神经啊,为甚非要封装成Event,传递单个参数, 莫急后面你就明白了!

拿个最简单的点击事件做例子简单分析下:

Paste_Image.png

可以看到继承了Observable.OnSubscribe其实就是一个Action1:

Paste_Image.png

然后,在call方法里,检测了当前是否为UI线程,不是的话抛出异常,否则view添加了OnClickListener, onClick调用了onNext();

然后说说这个MainThreadSubscription:

之前写了一篇文章: RxAndroid深入理解 http://www.jianshu.com/p/8292ea39c38e

留下了一个尾巴:MainThreadSubscription

贴上代码:

Paste_Image.png
Paste_Image.png

主要看unsubscribe方法, 这个方法就是取消订阅时做的事,该方法首先判断了是否为UI线程,是的话调用了onUnsubscribe();方法,非UI线程的话,调用了AndroidSchedulers.mainThread():

Paste_Image.png

Paste_Image.png

实际上调用了LooperScheduler的createWorker(), createWorker()实际上创建了一个叫HandlerWorker的类,之前那边文章也讲了,如果看的觉得理不清,看看我之前的那篇文章HandlerWorker其实就是持有一个根据用户传递给LooperScheduler的Looper所创建的Handler, 然后SechduleAction 把这里的action0:


Paste_Image.png

包装成一个Runnable, 让handler发送到所在线程! 从而被执行!

但是因为AndroidSchedulers.mainThread()传递的就是Looper.getMainLooper(),即UI线程的Looper

所以在非UI线程的情况下, onUnsubscribe();方法也只会在UI线程执行!

.

RxAnimation实现

.
这是我自己模仿RxBinding实现的对动画的各种事件的处理! 其实很简单!
地址:https://github.com/niniloveyou/RxJava-learn

.有兴趣的看看!!!


Paste_Image.png

比如我想在渐变动画执行完的时候做些什么! 就可以这样写了!

RxAnimation.onEnd(animation)
                .subscribe(new Action1<Animation>() {
            @Override
            public void call(Animation animation) {
                // do something
            }
        });

或者valueAnimator/ObjectAnimator

//update
RxAnimator.onUpdate(animator)
                .subscribe(new Action1<Float>() {
            @Override
            public void call(Float value) {
                //do something
            }
        });

这波装的可以吧! 可以你就点个赞。

1480384285107708.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,391评论 25 707
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 5,451评论 7 62
  • 前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占导zqq阅读 9,158评论 6 151
  • 鸡生蛋,鸡也拉屎,但我们肯定只吃蛋,不吃屎的,对鸡也如此,对人亦然。每个出色的人,都会生蛋,也会拉屎,例如他很会开...
    玉娇_娇阅读 366评论 0 0
  • 北方的冬天,已是冻杀了所有的绿色、青色,只留下了冬的痕迹,那一片片枯黄的被风缭乱的野草,那一棵棵忍痛被风摘掉了叶...
    4270c43538c5读你阅读 453评论 0 1