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
링크 가입에 대한 발표자를 작성하는 것입니다. 그러나 이는 몇 명의 발표자를 더 많이 붙잡아 두는 것을 의미합니다. 그러나 접근 방법은 조금 깨끗해 보입니다.
그래서 관찰 가능한 내용이 발표자에게 있습니까? 발표자에게 적어도 기본적인 라이프 사이클 이벤트가 없습니까? – yosriz
예, Rx chain과'CompositeDisposable'이 제 발표자에 있습니다. 예, '발표자'는 라이프 사이클에 무관심합니다. 나는 라이프 사이클 이벤트를 호출 할 메소드를 추가 할 수 있지만, 라이프 사이클 이벤트는 '어댑터'에서 사용할 수 있습니까? 어쨌든, 내 자신의 대답을 좀 더 이해할 수 있습니다. – vkislicins