RxLifecycle 替代方案

RxJava 的 Observable subscribe() 后會(huì)返回 Subscription(RxJava2 是在 onSubscribe(Disposable d)),我們都知道在 Activity 退出的時(shí)候要執(zhí)行 subscription.unsubscribe()。每個(gè) Observable 訂閱后,都要我們寫一些管理 Subscription 的代碼,于是懶惰的人們發(fā)現(xiàn)了 RxLifecycle,只要自己的 Activity extends RxActivity(還有其他的,不一一列舉),然后就只要一行代碼,就可以根據(jù) Activity 生命周期自動(dòng)取消訂閱

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

在 Activity 或 Fragment 里,這樣寫的確很方便,只是如果我們的架構(gòu)是 MVP 或者 MVVM,那么在 P 層、VM 層,如何寫呢?

我的設(shè)計(jì)是這樣的,有一個(gè)數(shù)據(jù)提供者 DataProvider,當(dāng)然是單例,比如

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

如果需要綁定當(dāng)前對(duì)象

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

這個(gè) tag 方法的參數(shù)是 Object(你應(yīng)該能想象到,這個(gè) Object 必然是某一個(gè) Map 的 key)
然后在 Activity onDestroy() 中

DataProvider.get().cancel(this);

既然這個(gè) tag 方法的參數(shù)是 Object,那么 P 層、VM 層中就方便了,綁定時(shí)就直接 tag(this),然后應(yīng)該有一個(gè) BasePresenter 或 BaseViewModel,里面寫個(gè) destroy() 方法,在 Activity onDestroy() 中調(diào)用 viewModel.destroy() 就完事了。

public class BaseViewModel {

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

所以關(guān)鍵是 DataProvider 到底是怎么實(shí)現(xiàn)的

public abstract class AbstractDataProvider implements WebService {

    protected Map<Object, AbstractDataProvider> 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 <T> Observable.Operator<T, T> bind() {
        return new Observable.Operator<T, T>() {
            @Override
            public Subscriber<? super T> call(Subscriber<? super T> subscriber) {
                subscription.add(subscriber);
                return subscriber;
            }
        };
    }

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

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

}

DataProvider主要是比AbstractDataProvider多了tag()方法,tag()返回的是AbstractDataProvider,防止多次調(diào)用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 二次動(dòng)態(tài)代理
4、網(wǎng)絡(luò)請(qǐng)求本地緩存

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容