2017-02-14 266 views
1

我創建了一個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

回答

4

爲什麼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