本来想弄一篇操作符集锦的文章,但是思来想去感觉单单把操作符弄出来走一遍意义不大,还是要举一些实际应用中例子,这样才来得更直观。
其实android开发中很多时候都可以转变一下思路,用rxjava的思想去做一些业务功能,从而让自己的代码显得更简洁更具有扩展性。
在这里不得不提到RxBinding 这个第三方库了,这个三方库可以说把rxjava的思想在Android开发中发挥得淋漓尽致。虽然现在已经有了4.0的版本,但是我们重在学习它的rxjava思想是怎么在安卓中体现的,所以还是以它的经典版本2.0来做讲解。
首先导入RxBinding2.0:
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
导入这个后就不需要再导入rxjava和rxandroid了,rxbingding自带了这两个依赖。
一. 监听单个TextView或EditText文字变化
//内部其实就是进行了addTextChangedListener封装
RxTextView.textChanges(mUserNameEt).subscribe(new Consumer<CharSequence>() {
@Override
public void accept(CharSequence charSequence) throws Exception {
//charSequence为mUserNameEt每次文字变化后的字符串
}
});
二. 监听多个TextView或EditText文字变化
Observable<CharSequence> mUserNameEtObservable = RxTextView.textChanges(mUserNameEt);
Observable<CharSequence> mUserPwdEtObservable = RxTextView.textChanges(mUserPwdEt);
//最高支持9个observable同时监听
Observable.combineLatest(mUserNameEtObservable, mUserPwdEtObservable, new BiFunction<CharSequence, CharSequence, Boolean>() {
@Override
public Boolean apply(CharSequence charSequence, CharSequence charSequence2) throws Exception {
//任何一个控件的文字变化了,都会回调到这个方法
//很适合做那种登录时用户名密码都输入的情况下,登录btn才可点击的效果
return false;
}
}).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
}
});
三. 防止重复点击
//300ms内只有一次点击响应
//debounce(防抖动)用到了ScheduledThreadPoolExecutor线程池执行延迟线程来做控制,如果在300s内连续点击,最新的点击
//会把之前的点击线程计划取消掉,总是执行最后一次点击,还有一个点要注意,如果不指定
//observeOn(AndroidSchedulers.mainthread()),accept()是执行在线程池维护的异步线程的
RxView.clicks(mClearContent).debounce(300, TimeUnit.MILLISECONDS).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
}
});
四. 控制操作时间间隔
// 原理跟上面的一样,用在监控EditText的文字输入上,可以很好的做输入框联想搜索功能,这样
//只会在700ms内输入最后的字之后700ms没操作的情况下开启搜索
RxTextView.textChanges(mUserNameEt).debounce(700, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<CharSequence>() {
@Override
public void accept(CharSequence charSequence) throws Exception {
log("do search");
}
});
五. 接口轮询,轮询操作
//一看就知道内部又是利用了ScheduledThreadPoolExecutor线程池做的
Observable.interval(2, 2, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
log("interval");
}
});
六. 接口轮询,轮询操作
// 延时操作,可用在开屏页等,基本关于延时的都用到了ScheduledThreadPoolExecutor,注意下游观察者是在异步线程执行
Observable.timer(2, TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
log("timer");
}
});
七. rxPermissions
用于申请动态权限,导入依赖
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
使用:
//看着是不是非常简单,但是其实里面做了大量的工作,它new了一个不可见的fragment来把该做的事情都做了,并没有绕过申请权限的任何什么步骤,在性能上要自己权衡
RxPermissions rxPermissions = new RxPermissions(this);
rxPermissions.request(Manifest.permission.CAMERA,Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if(aBoolean){
// 成功
}else {
// 失败
}
}
});
好了,暂时先讲这么多,关于rxbinding还有很多其他的有趣实用的功能,看完以上这些例子相信给你很多启发吧,原来我们日常开发中很多都可以用到rxjava的思想,其实确实是,rxjava的牛逼之处就是把这些看似没有关联的东西通过代码把他表达出来了。