2017-03-16 5 views
1

RecyclerView.Adapter 용으로 생성 된 발표자가 있습니다. 발표자는 API 레이어를 호출 한 다음 일부 로컬 데이터 값을 변경하는 방법을 가지고 있습니다. 이것은 RX 체인으로 구현됩니다.RecyclerView 어댑터 발표자에서 수신 거부 된 RxJava

public void doStuff(Object args) { 
    mRemote.doStuff(args) 
      .doOnNext(count -> mLocal.setStuffCount(count)) 
      .firstOrError() 
      .subscribeOn(mSchedulerProvider.io()) 
      .observeOn(mSchedulerProvider.ui()) 
      .subscribe(...) 
    <...> 

이 메서드는 다른 인수로 여러 번 호출 될 수 있으므로 다른 구독을 생성 할 수 있습니다. 알다시피, RxJava는 onComplete 또는 onError을 수신 거부합니다. 그러나 예를 들어 5 개의 구독이 생성되어있을 수 있으며 해결하기 전에 사용자가 조각에서 이동하므로 Adapter은 더 이상 적합하지 않으므로 수집해야합니다. 그러나 이해할 수있는 한, 해당 구독이 해결 될 때까지는 활성 구독 때문에 수집되지 않습니다.

일반적으로 발표자를 관련 뷰와 연결 한 다음 CompositeDisposable에 모든 구독을 저장하고 수명주기가 지울 때가되면 (예 :보기가 상태로 전환됨) 일회용 메시지를 지 웁니다. 그러나 비슷한 방법을 구현할 수 있습니다. 즉, 다음을 수행해야합니다.

뷰와 어댑터 사이의 관계를 설정하여 뷰의 라이프 사이클 메소드가 트리거 될 때 어댑터를 가져 와서 그것을 구독 취소 한 다음 발표자를 데리고 clear()을 호출하십시오. 그게 onDetachedFromRecyclerView에 의지 할 수 있을까요? 아니면 수동으로해야합니까?

2) 내 발표자 메소드를 호출 할 때마다 CompositeDisposable이 알 수있을 때까지 크기가 커질 것임을 의미하는 새로운 구독을 생성 할 예정입니다. 호출이 실행되었지만 일회용품은 여전히 ​​CompositeDisposable에서 참조됩니다.

나는 여기에 더 간단한 해결책이 있다는 느낌이 들었습니다.

편집 :

마음에 오는 또 다른 해결책, 바인딩 및 홀더의 재활용에 각각 ViewHolder 링크 가입에 대한 발표자를 작성하는 것입니다. 그러나 이는 몇 명의 발표자를 더 많이 붙잡아 두는 것을 의미합니다. 그러나 접근 방법은 조금 깨끗해 보입니다.

+0

그래서 관찰 가능한 내용이 발표자에게 있습니까? 발표자에게 적어도 기본적인 라이프 사이클 이벤트가 없습니까? – yosriz

+0

예, Rx chain과'CompositeDisposable'이 제 발표자에 있습니다. 예, '발표자'는 라이프 사이클에 무관심합니다. 나는 라이프 사이클 이벤트를 호출 할 메소드를 추가 할 수 있지만, 라이프 사이클 이벤트는 '어댑터'에서 사용할 수 있습니까? 어쨌든, 내 자신의 대답을 좀 더 이해할 수 있습니다. – vkislicins

답변

0

이것이 다른 사람에게 유용 할 지 모르지만 이것이이 문제를 어떻게 해결했는지는 확실하지 않습니다.

내가 병합 결국 내 Presenters 동안 (그 ViewHolderViewFragmentView를 호출)를 ViewHolderFragment에 대해 서로 다른 View 인터페이스를 유지.

ViewHolderView에 대해 Presenter의 아이디어가 마음에 들었지만 문제가 해결되지 않았습니다. 나는 내 CompositeDisposablePresenter 안에 유지하고 있었지만 그 접근법을 사용하여 나는 Adapter 레벨로 이동해야했고 내 ViewHolder 안에 Disposable에 대한 참조를 유지해야했습니다.대답 마찬가지로 내가 이미 FragmentViewsubscribe()unsubscribe()를 호출되면서 수동으로 Fragment 라이프 사이클에서 Adapter 조작의 아이디어를 좋아하지 않았다

here을 제안하고 RecyclerView에 어댑터를 무효화하지 않는 한 onDetachedFromRecyclerView가 호출되지 않습니다

ViewHolderView 인터페이스를 유지하면서 내 Adapter 발표자를 내 Fragment 발표자와 병합하는 것이 해결책이었습니다. 그래서 하나의 Presenter과 두 개의 분리 된 View 인터페이스에 대한 계약으로 끝났습니다. PresenterAdapter으로 전달합니다. FragmentView 구독을 취소하면 모든 항목이 정리됩니다.