为什么不能Observable.interval()取消订阅?
问题描述:
我创建了一个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
而且泄密者会通知很多次。我尝试谷歌一些方法来解决我的问题,但这些失败的工作。在这里:
答
为什么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);
});
}
}
但使用'CompositeSubscription'不起作用。 'subscriprion.add()' – ilumer