专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
stormzhang  ·  又被平均了? ·  昨天  
鸿洋  ·  Android系统native进程之我是in ... ·  2 天前  
鸿洋  ·  安卓应用跳转回流的统一和复用 ·  3 天前  
鸿洋  ·  一文搞懂Window、PhoneWindow ... ·  4 天前  
郭霖  ·  使用Hilt来协助封装网络请求 ·  1 周前  
51好读  ›  专栏  ›  安卓开发精选

初涉 Rx套餐 之 RxBinding(让你的事件流程更清晰)

安卓开发精选  · 公众号  · android  · 2016-09-13 08:04

正文

(点击上方公众号,可快速关注)


来源:伯乐在线专栏作者 - 王亟亟 

链接:http://android.jobbole.com/84596/

点击 → 了解如何加入专栏作者


最近下班回家都在WOW,周末就爆肝,感觉人都要狗带了,昨天下午看了看 RxBinding 相关的功能,感觉还是蛮强大的,所提供的API也是相当丰富(基本Rx套餐都是互通的),然后就把之前的Rx例子翻出来重新写一下。


还是老规矩,先安利:

https://github.com/ddwhan0123/Useful-Open-Source-Android(这礼拜在拆资料/博客/学习那模块,之前叠的有点多,还在分割)


什么是RxBinDing? 有什么作用?(网上相关的介绍也有,我这里整合一下)


JakeWharton 提供了一套在 Android 平台上的基于 RxJava的 Binding API。


类似设置 OnClickListener 、设置 TextWatcher 这样的注册绑定对象的 API。


并对普通的控件,V4,V7等等做了相应的支持。


项目git:

https://github.com/JakeWharton/RxBinding


如何使用依赖RxBinding这里不说了,这里来说下匿名函数的问题


因为谷歌和甲骨文之间搞不清楚所以安卓支持java8的特性需要“特殊操作”,那为什么要用java8特性呢?别的不说,主要是 Lambda,虽说这玩意可读性差,写起来自己绕晕,但是 省代码,省代码,省代码!!


在众多第三方支持插件里,比较推崇:https://github.com/evant/gradle-retrolambda


理由:不流氓+搭建简单


需要什么?


首先 你得下了java8,没下的话要去下载下,传送门:

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


然后在你的gradle里配置如下(截图是怕有写小伙伴贴错地方):




这样就可以用java 8的新特性了。


因为只演示普通控件,所以就用(按钮啊,文本啊,选择框啊什么的都在里面)


compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'


那就简单的搞个输入框,搞个按钮然后输入内容在TextView里显示就行。


废话不多说,直接上代码


public class MainActivity extends AppCompatActivity {

    Toolbar toolBar;

    EditText edit;

    TextView result;

    Button btn;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        init();

        logic();

    }

 

    private void init() {

        setSupportActionBar(toolBar);

        toolBar = (Toolbar) findViewById(R.id.toolBar);

        result = (TextView) findViewById(R.id.result);

        edit = (EditText) findViewById(R.id.edit);

        btn = (Button) findViewById(R.id.btn);

    }

 

    private void logic() {

        toolBar.setTitle("RxAndroidDemo");

 

        saveText();

        reFreshText();

    }

 

    private void reFreshText() {

        RxTextView.afterTextChangeEvents(edit).subscribe(textViewAfterTextChangeEvent -> {

            result.setText(textViewAfterTextChangeEvent.editable().toString());

        });

    }

 

    private void saveText() {

        RxView.clicks(btn)

//                .subscribeOn(Schedulers.io())

//                .observeOn(AndroidSchedulers.mainThread())

                .subscribe(new Subscriber() {

                    @Override

                    public void onCompleted() {

                        result.setText(SharePreferencesTools.getString(MainActivity.this, "user") + " now ");

 

                    }

@Override

                    public void onError(Throwable e) {

 

                    }

 

                    @Override

                    public void onNext(Void aVoid) {

                        SharePreferencesTools.putString(MainActivity.this, "user", edit.getText().toString().trim());

                        onCompleted();

                    }

                });

    }

}


这边的Demo并没有用注解获取对象,实际上组合拳套餐会用的更舒服点,毕竟有插件一键find。


我们这些”RxView”的行为还是要在onCreate里执行了(尽管用户不点不触发,但是你还得像平时setListener那样先把行为注册掉)


EditText用RxTextView,其他一些还是用RxView.


api提供了 诸如textChanges ,afterTextChangeEvents等一系列替代之前回调的方法,进一步摆脱“回调地狱”。


因为是Rx套餐,所以那些线程行为,异步行为,.map() .first()等等等方法都可以用


这边提再一个“优化”的问题


当你逻辑结束了不用了,之前订阅的被观察者与观察者的关系请做取消订阅操作,调用 unsubscribe()就行


源码地址:


https://github.com/ddwhan0123/RxAndroidDemo/tree/master/RxAndroidGlideDemo


补几个资料,大家也可以看看:


http://www.cnblogs.com/zhaoyanjun/p/5523454.html

http://hanks.xyz/2015/11/29/rx_ux/


专栏作者简介( 点击 → 加入专栏作者 


王亟亟 :专业养小动物,顺道敲敲代码,致力于传播欢笑播撒爱!

打赏支持作者写出更多好文章,谢谢!




------------------ 推荐 ------------------


范品社推出了十几款程序员、电影、美剧和物理题材的极客T恤单件 ¥59.9、两件减¥12、四件减¥28,详见网店商品页介绍。

网店地址:https://fanpinshe.taobao.com/

淘口令:复制以下红色内容,然后打开手淘即可购买

范品社,使用¥极客T恤¥抢先预览(长按复制整段文案,打开手机淘宝即可进入活动内容)