什么是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
时会调用它) - 将
CompositeSubscription
对象保留在adapter
中
- 使用
Adapter
的onDetachedFromRecyclerView
方法将unsubscribe
compositeSubscription
subscription
引用
- 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屋!
查看全文