2017-02-14 5 views
1

私はviewpagerを作成し、fragmentRecyclerView & 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); 
      }); 
} 

Iフラグメントと、メモリリークを見つけるためLeakcanaryを使用します。ビューページをスワイプすると、フラグメントがメモリをリークします。私はadapter.onViewDetachedFromWindowでこれを止めると、リークキャナリーはいつも何度も通知します。私は私の問題を解決するためにいくつかの方法をGoogleにしようとするが、それらは動作しません。ここでは:あなたが二回startPlayを呼び出す誤っている場合

the leakcanary

答えて

4

理由(Observable.interval)、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

関連する問題