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

标签 android android-recyclerview android-lifecycle

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

  @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/

相关文章:

android动态改变文字大小

android - 从联系人获取电子邮件和电话 Android

android - 在 Cursor 支持的 RecyclerView 中隐藏(并重新显示)卡片

android - RecyclerView ItemTouchHelper 如何锁定滑动项目?

android 生命周期 onActivityResult 与 onStop

java - 弹出窗口未显示微调项选择?

android - FIRESTORE 持久数据

java - Android RecyclerView 内容在 notificationItemInserted 后未更新

android - 防止我的 Android 应用程序的多个实例由单个 Activity 组成

java - Android 为什么文本显示在onCreate