//rxjava
compile 'io.reactivex:rxjava:latest.release'
//rxAndroid
compile 'io.reactivex:rxandroid:latest.release'
//rxLifecycle
compile 'com.trello:rxlifecycle:latest.release'
compile 'com.trello:rxlifecycle-components:latest.release'
compile 'com.trello:rxlifecycle-android:latest.release'
为什么要使用RxLifecycle?虽然rxjava使用起来,但是过度使用不释放的话就会产生内存泄漏,RxLifeCycle可以帮助我们在组件生命周期的某个阶段或者指定事件发生时自动取消订阅,其项目地址在:https://github.com/trello/RxLifecycle(RxLifecycle的最低API是14)
使用方法也很简单:
//1. 需要继承对应的RxAppCompatActivity
public class MainActivity extends RxAppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//在onCreate()中绑定,将在对应的onDestory()中解除订阅关系
Observable.interval(5, TimeUnit.SECONDS).
compose(bindUntilEvent(ActivityEvent.DESTROY))
.doOnUnsubscribe(() ->{
Log.d("MainActivity", "解除订阅");}
).subscribe(aLong -> {
Log.d("MainActivity", "start task:" + Thread.currentThread().getName());
});
}
}
RxView.clicks(TextView)
.compose(bindUntilEvent(ActivityEvent.DESTROY)).subscribe(aVoid -> {
...do some things
});
比如在某些情况下,点击了某个按钮进行网络请求或者进入下个按钮,但是这个操作可能不是立马显现出结果,用户以为无响应而多次点击Button或者恶意快速点击的情况下,这个时候我们就可以使用throttleFirst
来解决这个问题,所以上面的例子可以改为:
RxView.clicks(TextView)
.compose(bindUntilEvent(ActivityEvent.DESTROY))
.throttleFirst(1L,TimeUnit.SECONDS).subscribe(aVoid -> {
...do some things
});
比如要对EditeText
的输出监听,可以使用RxTextView.textChanges
,还有更多操作可以查看RxBinding项目说明即可:https://github.com/JakeWharton/RxBinding。
//绑定输入view事件
RxTextView.textChanges(EditeText).compose(bindUntilEvent(ActivityEvent.DESTROY))
.subscribe(charSequence -> {
...do some things
});
如果我们需要周期性执行某个任务,可以使用rxjava的interval
:
Observable.interval(5, TimeUnit.SECONDS).subscribe(aLong -> {
...do some things
});
这段代码表示每5秒执行某个操作;
在一些情况下我们需要执行定时任务,在Rxjava里我们可以使用timer
:
Observable.timer(2, TimeUnit.SECONDS).subscribe(aLong -> {
...do some things
});
比如我们需要做某些耗时操作需要在一个新的线程里进行,结果返回到主线程里:
Observable.just(1, 2, 3, 4)
.subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
.observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
.subscribe(number ->{
...do some things
});
使用rxjava与retrofit来做网络请求会大大的节省了你很多,比如你可以很轻松的进行线程切换,数据转换什么的等;具体参考这篇: RxJava 与 Retrofit 结合的最佳实践 文章;
RxBus并不是一个库,而是一种模式,是使用了RxJava的思想来达到EventBus的数据传递效果,可以以下文章来自己实现RxBus:
Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(final Subscriber<? super String> observer) {
Schedulers.newThread().createWorker()
.schedulePeriodically(new Action0() {
@Override
public void call() {
observer.onNext(doNetworkCallAndGetStringResult());
}
}, INITIAL_DELAY, POLLING_INTERVAL, TimeUnit.MILLISECONDS);
}
}).subscribe(s ->{
...do some things
});