最近下班回家都在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的新特性了。
因为只演示普通控件,所以就用(按钮啊,文本啊,选择框啊什么的都在里面)
1 |
compile 'com.jakewharton.rxbinding:rxbinding:0.4.0' |
那就简单的搞个输入框,搞个按钮然后输入内容在TextView里显示就行。
废话不多说,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
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<Void>() { @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