RecyclerView 适配器的生命周期是什么? [英] What is lifecycle for RecyclerView adapter?
本文介绍了RecyclerView 适配器的生命周期是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在适配器中请求演示者提供图像:
I'm requesting images from presenter in adapter:
@Override
public void onBindViewHolder(SiteAdapter.ViewHolder holder, int position)
{
Site site = sites.get(position);
holder.siteName.setText(site.getName());
requestHolderLogo(holder, site.getLinks().getLogoUrl());
}
private void requestHolderLogo(final ViewHolder holder, final String logoUrl)
{
compositeSubscription.add(
presenter.bitmap(logoUrl)
.subscribe(
bitmap -> {
holder.siteLogo.setImageBitmap(bitmap);
holder.siteLogo.setVisibility(View.VISIBLE);
},
error -> {
holder.siteName.setVisibility(View.VISIBLE);
})
);
}
当 ViewHolder
被重新使用时,我应该取消订阅.很简单.
I should unsubscribe when ViewHolder
is re-used. It is easy.
但是当视图被销毁时如何停止所有订阅?我也应该取消演示者引用以避免内存泄漏
But how stop all subscription when view is destroyed? I should also probably nullify presenter reference to avoid memory leak
推荐答案
我认为最好的方法是:
- 在
SiteAdapter.ViewHolder
中保留一个 unsubscribe
onBindViewHolder
中的subscription
对象(当ViewHolder
被重用时调用)- 在您的
适配器
中保留 - 使用
Adapter
的onDetachedFromRecyclerView
方法来取消订阅
compositeSubscription
subscription
引用CompositeSubscription
对象- Keep a
subscription
reference in theSiteAdapter.ViewHolder
unsubscribe
thesubscription
object inonBindViewHolder
(it's called when theViewHolder
is reused)- Keep the
CompositeSubscription
object in youradapter
- Use the
onDetachedFromRecyclerView
method of yourAdapter
tounsubscribe
thecompositeSubscription
像这样:
public class SiteAdapter extends RecyclerView.Adapter<SiteAdapter.ViewHolder> {
private CompositeSubscription compositeSubscription = new CompositeSubscription();
// other needed SiteAdapter methods
@Override
public void onBindViewHolder(SiteAdapter.ViewHolder holder, int position) {
if (holder.subscription != null && !holder.subscription.isUnsubscribed()) {
compositeSubscription.remove(holder.subscription);
// this will unsubscribe the subscription as well
}
Site site = sites.get(position);
holder.siteName.setText(site.getName());
requestHolderLogo(holder, site.getLinks().getLogoUrl());
}
private void requestHolderLogo(final SiteAdapter.ViewHolder holder, final String logoUrl) {
holder.subscription = presenter.bitmap(logoUrl)
.subscribe(
bitmap -> {
holder.siteLogo.setImageBitmap(bitmap);
holder.siteLogo.setVisibility(View.VISIBLE);
},
error -> {
holder.siteName.setVisibility(View.VISIBLE);
});
compositeSubscription.add(holder.subscription);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
compositeSubscription.unsubscribe();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public Subscription subscription;
// some holder-related stuff
public ViewHolder(View itemView) {
super(itemView);
// init holder
}
}
}
这篇关于RecyclerView 适配器的生命周期是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文