RxLifecycle 대안

3601 단어
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는 필연적으로 어떤 맵의 키입니다.) 그리고Activity on Destroy () 에서
DataProvider.get().cancel(this);

이 tag 방법의 매개 변수가 Object인 이상 P층, VM층에서 편리하다. 귀속할 때 바로 tag(this)를 하고 BasePresenter나BaseViewModel이 있어야 한다. 그 안에destroy() 방법을 쓰고Activity on Destroy()에서vieModwel을 호출해야 한다.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 super T> call(Subscriber super T> 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는 주로 Abstract DataProvider보다 tag() 방법이 많고, tag()는 Abstract DataProvider로 되돌아와 여러 번 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 2차 동적 에이전트 4, 네트워크 요청 로컬 캐시

좋은 웹페이지 즐겨찾기