Android如何关联rxJava和lifecycle,避免内存泄露
16lz
2021-01-26
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的内存泄露问题了。
更多相关文章
- Android中RadioGroup的初始化和简单的使用
- 【Android】监听蓝牙状态变化
- Android仿淘宝头条垂直滚动,垂直走马灯,公告
- 【Android开发 蓝牙连接状态】Android实时检测蓝牙连接状态
- Android(安卓)SwipeLayout实现界面滑动布局
- pre-network 网络预加载框架,android网络优化
- Android(安卓)如何监听返回键,弹出一个退出对话框
- (笔记)Android的OnGestureListener中onFling()的使用注意
- 9.Swift UIImagePickerController选取图片