Android如何关联rxJava和lifecycle,避免内存泄露

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

猜你喜欢

转载自blog.csdn.net/archie_7/article/details/106410104