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的内存泄露问题了。

更多相关文章

  1. Android中RadioGroup的初始化和简单的使用
  2. 【Android】监听蓝牙状态变化
  3. Android仿淘宝头条垂直滚动,垂直走马灯,公告
  4. 【Android开发 蓝牙连接状态】Android实时检测蓝牙连接状态
  5. Android(安卓)SwipeLayout实现界面滑动布局
  6. pre-network 网络预加载框架,android网络优化
  7. Android(安卓)如何监听返回键,弹出一个退出对话框
  8. (笔记)Android的OnGestureListener中onFling()的使用注意
  9. 9.Swift UIImagePickerController选取图片

随机推荐

  1. Windows版本 Android(安卓)studio安装教
  2. Android中list集合的排序方法
  3. Android(安卓)Studio快捷键提高工作效率
  4. 创建Android(安卓)Virtual Device
  5. OpenGL ES 2.0 Shader总结
  6. 【Android】用retrofit2和rxjava2搭建网
  7. Android数据库(SQLite)的简单使用——增、
  8. android根目录获取
  9. Android绘图之PathEffect (8)
  10. 关于android双屏异显的一些总结和卡死的