我创建了一个viewpager
,而fragment
具有一个RecyclerView
和viewholder
。
@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()
最佳答案
为什么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);
});
}
}