2017-02-14 2 views
1

Ich habe eine viewpager erstellt und die fragment hat eine RecyclerView & viewholder.Warum kann Observable.interval() nicht abbestellen?

@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 verwendet Leakcanary den Speicherverlust mit dem Fragment zu finden. Wenn ich den Viewpager wische, verliert das Fragment Speicher. Ich rufe diesen Stop mit dem adapter.onViewDetachedFromWindow an und Leckcanary wird immer viele Male benachrichtigen. Ich versuche, einige Wege zu googlen, um mein Problem zu lösen, aber diese funktionieren nicht. Hier:

the leakcanary

Antwort

4

warum Observable.interval() kann nicht

abmelden, wenn sie versehentlich Sie startPlay zweimal rufen, y ou überschreiben Sie das vorherige Abonnement, und Sie verlieren es daher. Um es zu überwinden, können Sie nur abonnieren, wenn das Abonnement abgemeldet ist. Z.B.

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

aber what 'CompositeSubscription' funktioniert nicht. 'subscriprion.add()' – ilumer

Verwandte Themen