RxLifecycle 替代方案

RxJava 的 Observable subscribe() 后会返回 Subscription(RxJava2 是在 onSubscribe(Disposable d)),我们都知道在 Activity 退出的时候要执行 subscription.unsubscribe()。每个 Observable 订阅后,都要我们写一些管理 Subscription 的代码,于是懒惰的人们发现了 RxLifecycle,只要自己的 Activity extends RxActivity(还有其他的,不一一列举),然后就只要一行代码,就可以根据 Activity 生命周期自动取消订阅

observable
    ...
    .compose(this.<>bindUntilEvent(ActivityEvent.DESTROY))
    .subscribe(...);

在 Activity 或 Fragment 里,这样写的确很方便,只是如果我们的架构是 MVP 或者 MVVM,那么在 P 层、VM 层,如何写呢?

我的设计是这样的,有一个数据提供者 DataProvider,当然是单例,比如

DataProvider.get().getNews()  --> 返回 Observable
DataProvider.get().getLoginUser() --> 返回 Observable

如果需要绑定当前对象

DataProvider.get().tag(this).getNews()
DataProvider.get().tag(this).getLoginUser()

这个 tag 方法的参数是 Object(你应该能想象到,这个 Object 必然是某一个 Map 的 key)
然后在 Activity onDestroy() 中

DataProvider.get().cancel(this);

既然这个 tag 方法的参数是 Object,那么 P 层、VM 层中就方便了,绑定时就直接 tag(this),然后应该有一个 BasePresenter 或 BaseViewModel,里面写个 destroy() 方法,在 Activity onDestroy() 中调用 viewModel.destroy() 就完事了。

public class BaseViewModel {

    public void destroy() {
        DataProvider.get().cancel(this);
    }
}

所以关键是 DataProvider 到底是怎么实现的

public abstract class AbstractDataProvider implements WebService {

    protected Map providerMap = new WeakHashMap<>();

    private CompositeSubscription subscription = new CompositeSubscription();

    public void cancel(Object target) {
        AbstractDataProvider provider = providerMap.get(target);
        if (provider == null) {
            return;
        }
        provider.cancel();
    }

    public void cancel() {
        subscription.unsubscribe();
        for (AbstractDataProvider provider : providerMap.values()) {
            provider.cancel();
        }
    }

    private  Observable.Operator bind() {
        return new Observable.Operator() {
            @Override
            public Subscriber call(Subscriber subscriber) {
                subscription.add(subscriber);
                return subscriber;
            }
        };
    }

    @Override
    public Observable getNewsList(String date) {
        return WebServiceProvider.get().getNewsList(date).lift(this.bind());
    }

    @Override
    public Observable getTopNewsList() {
        return WebServiceProvider.get().getTopNewsList().lift(this.bind());
    }

}

DataProvider主要是比AbstractDataProvider多了tag()方法,tag()返回的是AbstractDataProvider,防止多次调用tag()

public class DataProvider extends AbstractDataProvider {

    private static class DataProviderHolder {
        private static final DataProvider INSTANCE = new DataProvider();
    }

    public static DataProvider get() {
        return DataProviderHolder.INSTANCE;
    }

    private DataProvider() {
    }

    public AbstractDataProvider tag(Object target) {
        AbstractDataProvider provider = providerMap.get(target);
        if (provider == null) {
            provider = new DataProvider();
            providerMap.put(target, provider);
        }
        return provider;
    }

}

源码,主要包含
1、MVVM
2、RxJava 生命管理
3、Retrofit 二次动态代理
4、网络请求本地缓存

你可能感兴趣的:(RxLifecycle 替代方案)