40

Android 之路 (12) - RxLifecycle的集成

 4 years ago
source link: https://www.tuicool.com/articles/IziIFjN
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

引言

引入 Rx 系列有一个非常大的缺陷:容易造成内存泄露,大多数都是忘记取消订阅而造成的,本篇就以 RxLifecycle 进行封装,在底层实现自动订阅与取消订阅。

正文

分析

我们在之前的 Android 之路 (4) - 对RxJava2的简单封装 中,在 BasePresenter 中有一个 unDisposable 的方法,该方法会在 onDestroyonDialogCance 的时候调用,这已经从一定程度上避免了内存泄露,但是这不够的,接下来就来集成 Rxlifecycle 吧。

注意:Rxlifecycle 版本使用的是 2

编码

引入 Rxlifecycle

library-core 中引入:

api 'com.trello.rxlifecycle2:rxlifecycle:2.2.1'
api 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.1'
api 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.1'

修改继承关系

  1. SwipeBackActivity

前面的文章中我们集成了 SwipeBackActivity 作为所有 Activity 的基类,所以我们只需要更改 SwipeBackActivity 继承 com.trello.rxlifecycle2.components.support.RxAppCompatActivity

  1. CandyBaseFragment

CandyBaseFragment 更改继承为 com.trello.rxlifecycle2.components.support.RxFragment

修改 BasePresenter

在前面的封装中,我们其实是没有持有 BaseView 的,这里我们需要更改一下,增加对 BaseView 的引用,好做接下来的操作。

private BaseView mView;

public BasePresenter(BaseView mView) {
	this.mView = mView;
}

绑定生命周期

之前封装过一个用于切换线程的 getScheduler 方法,用于在所有的 presenter 中进行调用,所以接下来的代码就和 getScheduler 合并在一起,代码如下:

/**
     * 统一线程处理和绑定生命周期
     *
     * @turn
     * @par<T>
     */
    protected <E> FlowableTransformer<E, E> getScheduler() {    //compose简化线程
        return new FlowableTransformer<E, E>() {
            @Override
            public Flowable<E> apply(Flowable<E> observable) {
                // 最终用于订阅的
                LifecycleTransformer<E> bindUntilEvent = null;
                // ---------------------------------判断是相应的类型,进行绑定------------
                if (mView instanceof RxAppCompatActivity) {
                    bindUntilEvent = ((RxAppCompatActivity) mView).bindUntilEvent(ActivityEvent.DESTROY);
                }
                if (mView instanceof RxFragmentActivity) {
                    bindUntilEvent = ((RxFragmentActivity) mView).bindUntilEvent(ActivityEvent.DESTROY);
                }
                if (mView instanceof RxActivity) {
                    bindUntilEvent = ((RxActivity) mView).bindUntilEvent(ActivityEvent.DESTROY);
                }
                if (mView instanceof RxFragment) {
                    bindUntilEvent = ((RxFragment) mView).bindUntilEvent(FragmentEvent.DESTROY);
                }
                if (mView instanceof com.trello.rxlifecycle2.components.support.RxFragment) {
                    bindUntilEvent = ((com.trello.rxlifecycle2.components.support.RxFragment) mView).bindUntilEvent(FragmentEvent.DESTROY);
                }
                // ---------------------------------判断是相应的类型,进行绑定------------

                Flowable<E> flowable = observable.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread());

                if (bindUntilEvent != null) {
                    //绑定
                    flowable = observable.subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread()).compose(bindUntilEvent);
                }
                return flowable;
            }
        };
    }

运行

其它地方并没有什么修改, getScheduler 的变更是完全兼容以前的老版本的,另外本次修改也和上次看不出什么区别,所以我们直接运行看看吧。

V7nqIbi.gif

结束

其它

本次顺便修改了 login 的请求地址,以前使用的临时域名已经失效了。

总结

本文篇幅较少,只做了集成介绍和一个小问题的解决方案,这次封装在短期是看不出效果的。

源码-tag-v0.10

如果可以的话,请给我一个star 仓库地址

广告

来都来了,就给个关注吧,时不时会悄悄的推送一些小技巧的文章~~

yYZnya2.jpg!web

软广

来都来了,就给个关注吧,时不时会悄悄的推送一些小技巧的文章~~!

mqUrme2.jpg!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK