rxJava的使用
rxJava的使用比较复杂,有很多使用技巧。分享一个比较全的介绍:
rxJava使用
此问题相关的技术
1、rxjava compose的使用
2、rxjava takeUntil的使用
3、lifecycle的使用及原理
如何关联rxJava和Lifecycle
1、RxJavaLifecycle用来监听生命周期变化并使用BehaviorSubject分发状态
private class RxJavaLifecycle implements LifecycleObserver {
private BehaviorSubject<Lifecycle.Event> subject;
public RxJavaLifecycle(BehaviorSubject<Lifecycle.Event> subject) {
this.subject = subject;
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
subject.onNext(Lifecycle.Event.ON_DESTROY);
}
}
2、LifecycleTransformer用于扩展Observable并添加自己的运算
private class LifecycleTransformer<T> implements Observable.Transformer<T, T> {
private final Observable<Lifecycle.Event> mLifecycle;
public LifecycleTransformer(Observable<Lifecycle.Event> lifecycle) {
mLifecycle = lifecycle;
}
@Override
public Observable<T> call(Observable<T> source) {
return source
.observeOn(AndroidSchedulers.mainThread())
.takeUntil(mLifecycle.takeFirst(new Func1<Lifecycle.Event, Boolean>() {
@Override
public Boolean call(Lifecycle.Event lifecycleEvent) {
return lifecycleEvent == Lifecycle.Event.ON_DESTROY;
}
}));
}
}
3、Activity使用
public class MainActivity extends AppCompatActivity {
private final String TAG = "TestDemo";
private final BehaviorSubject<Lifecycle.Event> mLifecycleSubject = BehaviorSubject.create();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new RxJavaLifecycle(mLifecycleSubject));
Observable.fromCallable(new Callable<Bundle>() {
@Override
public Bundle call() throws Exception {
Thread.sleep(5000);
return new Bundle();
}
}).subscribeOn(Schedulers.io())
.compose(bindLifecycle())
.subscribe(new Subscriber<Bundle>() {
@Override
public void onCompleted() {
Log.d(TAG, "==========================onCompleted");
}
@Override
public void onError(Throwable e) {
Log.d(TAG, "==========================onError");
}
@Override
public void onNext(Bundle bundle) {
Log.d(TAG, "==========================onNext");
}
});
}
@Override
protected void onDestroy() {
Log.d(TAG, "==========================Activity.onDestroy");
super.onDestroy();
}
private Observable.Transformer<Bundle, Bundle> bindLifecycle() {
return new LifecycleTransformer<>(mLifecycleSubject);
}
}
4、运行结果分析
启动Activity后,然后退出页面。你会发现subscribe的观察者在睡醒五秒后没有调用onNext(),也就不会发生onNext内部处理ui的内存泄露问题了。