gpt4 book ai didi

android - RecyclerView 适配器的生命周期是什么?

转载 作者:IT王子 更新时间:2023-10-28 23:47:34 27 4
gpt4 key购买 nike

我正在向适配器中的演示者请求图像:

  @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 被重复使用时,我应该取消订阅。这很容易。

但是当 View 被销毁时如何停止所有订阅?我还应该取消演示者引用以避免内存泄漏

最佳答案

我认为最好的方法是:

  1. SiteAdapter.ViewHolder
  2. 中保留 subscription 引用
  3. unsubscribe onBindViewHolder 中的subscription 对象(在ViewHolder 被重用时调用)
  4. CompositeSubscription 对象保留在 adapter
  5. 使用 AdapteronDetachedFromRecyclerView 方法unsubscribe compositeSubscription

像这样:

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

关于android - RecyclerView 适配器的生命周期是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37674692/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com