我创建了一个viewpager,而fragment具有一个RecyclerViewviewholder

@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将此停止称为“ stopcan”,leakcanary将始终通知很多次。我尝试用谷歌搜索一些方法来解决我的问题,但是这些方法都行不通。这里:


CompositeSubscription.unsubscribe
Obseravle.interval().onTerminateDetach()


android - 为什么Observable.interval()无法退订?-LMLPHP

最佳答案

为什么Observable.interval()无法取消订阅


如果不小心您两次调用startPlay,则会覆盖先前的订阅,因此会泄漏它。为了克服它,您只能在未订阅的情况下订阅。例如。

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);
        });
    }
}

09-10 06:14
查看更多