为什么不能Observable.interval()取消订阅?

为什么不能Observable.interval()取消订阅?

问题描述:

我创建了一个viewpager,而fragment有一个RecyclerView & viewholder为什么不能Observable.interval()取消订阅?

@Override 
public void bindModel(GankInfo item) { 
    super.bindModel(item); 
    picViewPager.setOnTouchListener(((v, event) -> { 
     switch (event.getAction()){ 
      case MotionEvent.ACTION_DOWN: 
      case MotionEvent.ACTION_MOVE:{ 
       stopPlay(); 
       break; 
      } 
      case MotionEvent.ACTION_CANCEL: 
      case MotionEvent.ACTION_UP:{ 
       startPlay(); 
       break; 
      } 
     } 
     return false; 
    })); 
} 

@Override 
public void onAttach() { 
    super.onAttach(); 
    startPlay(); 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    stopPlay(); 
} 

private void stopPlay(){ 
    subscription.unsubscribe(); 
} 

private void startPlay(){ 
    subscription = 
      Observable.interval(3, TimeUnit.SECONDS) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(aLong -> { 
          int currentPosition = picViewPager.getCurrentItem(); 
          currentPosition++; 
          picViewPager.setCurrentItem(currentPosition==picViewPager.getAdapter().getCount()?0:currentPosition); 
      }); 
} 

我用Leakcanary来找到片段的内存泄漏。当我滑动viewpager的片段会泄漏内存。我把这个站叫做adapter.onViewDetachedFromWindow而且泄密者会通知很多次。我尝试谷歌一些方法来解决我的问题,但这些失败的工作。在这里:

the leakcanary

为什么Observable.interval()不能退订

如果不小心你打电话startPlay两次,Y ü覆盖以前的订阅,因此您正在泄漏它。为了克服它,您只能在订阅取消订阅的情况下订阅。例如。

Subscription subscription = Subscriptions.unsubscribed(); 

private void startPlay(){ 
    if (subscription.isUnsubscribed()) { 
     subscription = 
       Observable.interval(3, TimeUnit.SECONDS) 
         .observeOn(AndroidSchedulers.mainThread()) 
         .subscribe(aLong -> { 
          int currentPosition = picViewPager.getCurrentItem(); 
          currentPosition++; 
          picViewPager.setCurrentItem(currentPosition==picViewPager.getAdapter().getCount()?0:currentPosition); 
     }); 
    } 
} 
+0

但使用'CompositeSubscription'不起作用。 'subscriprion.add()' – ilumer