美文网首页
glide使用,item不可见时(滑过了或页面切换了)。停止加载

glide使用,item不可见时(滑过了或页面切换了)。停止加载

作者: 金卡戴珊ugly | 来源:发表于2019-12-30 10:30 被阅读0次

glide和RecyclerView版本:

implementation 'com.github.bumptech.glide:glide:3.8.0'
    implementation 'androidx.recyclerview:recyclerview:1.1.0'

列表适配器代码

//未封装adapter
public class GridAdapterNoPack extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private LayoutInflater mLayoutInflater;
    List<SearchResultItem> list;

    public GridAdapterNoPack(Context context, List<SearchResultItem> list) {
        mLayoutInflater = LayoutInflater.from(context);
        this.list = list;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mLayoutInflater.inflate(R.layout.grid_item, parent, false);
        ItemViewHolder viewHolder = new ItemViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        if (position < list.size()) {
            ImageView iv = ((ItemViewHolder) holder).mContentTv;
            Glide.with(iv.getContext())
                    .load(list.get(position).getPgrpLogo())
                    .placeholder(R.mipmap.epg_bg)
                    .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            return false;
                        }

                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            Log.e("Glide", " position:" + position + " onResourceReady");
                            return false;
                        }
                    })
                    .into(iv);
            holder.itemView.setTag(position);
        }
    }

    @Override
    public int getItemCount() {
        return this.list.size();
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {
        private ImageView mContentTv;

        ItemViewHolder(View itemView) {
            super(itemView);
            mContentTv = itemView.findViewById(R.id.video_image);
        }
    }

    void add(List<SearchResultItem> list, boolean b) {
        this.list.addAll(list);
        notifyDataSetChanged();
    }
}

滑动列表 观察图片加载情况,onResourceReady打印了表示该位置图片加载完成。可得出结论:item不可见时线程及时回收了。
因为我在项目中使用了BaseQuickAdapter类,观察发现快速滑动,之前的item还是会加载。
为了解决这个问题,只得手动停止加载,代码如下:

@Override
    public void onViewDetachedFromWindow(@NonNull RecyclerView.ViewHolder holder) {
        super.onViewDetachedFromWindow(holder);
        if(holder.getAdapterPosition()!=-1){
            Glide.clear(holder.itemView.findViewById(R.id.video_image));
        }
    }

值得注意的是,我本来使用glide4.9.0时,无论有没有使用baseQuickAdapter都没办法暂停线程。所以回退到了3.8.0
新版本真的要慎重检验再使用。

相关文章

网友评论

      本文标题:glide使用,item不可见时(滑过了或页面切换了)。停止加载

      本文链接:https://www.haomeiwen.com/subject/itupoctx.html