2017-11-03 15 views
1

깨끗한 아키텍처로 안드로이드 프로젝트를 작업하고 있습니다.이 경우 DisposableObserver 처리가 중요합니다.

public abstract class RxBaseInteractor<T, Params> { 

    private final CompositeDisposable disposables; 

    public RxBaseInteractor() { 
    this.disposables = new CompositeDisposable(); 
    } 

    abstract public Observable<T> buildUseCaseObservable(Params params); 

    public void execute(DisposableObserver<T> observer, Params params) { 
    Preconditions.checkNotNull(observer); 
    final Observable<T> observable = this.buildUseCaseObservable(params) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 
    addDisposable(observable.subscribeWith(observer)); 
    } 

    public void dispose() { 
    if (!disposables.isDisposed()) { 
     disposables.dispose(); 
    } 
    } 

    protected void addDisposable(Disposable disposable) { 
    Preconditions.checkNotNull(disposable); 
    Preconditions.checkNotNull(disposables); 
    disposables.add(disposable); 
    } 
} 

그래서 실행 (..)를 DisposableObserver을하고이 관찰을 처리하기 위해 호출하는 처분() 방법이있다 : 나는 아래의 클래스가 있습니다.

내 경우에는 관측 영역이 영역을 사용하는 개장 또는 캐시를 사용하여 WebApi에서 올 수 있습니다.

@Override public void onDestroy() { 
    super.onDestroy(); 
    if (getPresenter() != null) { 
     getPresenter().destroy(); 
    } 
    } 

내가 완전히 구조를 이해 : 뷰에서 그 후라고

@Override public void destroy() { 
     super.destroy(); 
     myInteractor.dispose(); 
    } 

:

지금 발표자들의 OnDestroy()에서, 나는 같은 interactor.dispose을()가 호출 또한 관리되지 않는 네트워크 또는 데이터베이스 리소스를 처리하는 이해하지만이 경우에는 관찰 할 수있는 실제 처분의 경우 완전히 개혁 또는 영역 자동 연결을 닫고 리소스를 처분 관리 생각하는 경우 완전히 이해해야합니다.

클래스 DisposableObserver :

나는이 영역 또는 갱신 할 자원을 폐기 관련은 아니지만이 내가 설명서를 확인으로 관찰 그 자체에 취소 관련 될 수 있으며 내가 찾은 것 같아요 수 있습니다 추상 관찰자 일회용을 구현하는 비동기 취소 . 사전 구현 된 모든 최종 메서드는 스레드 안전성이 입니다.

public 구현 인 dispose() 메서드를 사용하여onNext 구현 내에서 시퀀스를 처리합니다.

하지만 여전히 사용의 이점을 이해하지 못합니다. 관찰을 취소하면 뷰가 파손될 때 onNext()에서 onComplete()로 이동하고 이미 터의 구독을 닫을 수 있습니까?

답변

1

시스템이보기 (작업 또는 조각)를 시작한 후에 dispose 메서드를 사용하는 이유. subscription이 시작된 후 subscription이 여전히 실행되고 작업이 완료되지 않은 상태로 돌아가거나 다른보기를 시작하기로 결정한 경우 이는 메모리 누수가 발생할 메모리에 남아 있음을 의미합니다. 따라서 구독을 취소하려면 dispose 메소드를 호출해야합니다.