用glide替换图像时的短延迟

daolsyd0  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(318)

我不想简单地改变一个图像从一个到另一个图像时,用户点击它。这里的问题是,当第一个图像被替换时,会有大约100毫秒的短暂延迟。这是相当恼人的,因为你可以清楚地看到,图像消失了很短的时间,当滑翔加载image2。
下面是我如何预加载图像:

Glide
                    .with(mContext)
                    .load(imageURL)
                    .diskCacheStrategy(DiskCacheStrategy.DATA)
                    .preload();

下面是我如何显示图像:

Glide
                    .with(mContext)
                    .load(imageURL)
                    .diskCacheStrategy(DiskCacheStrategy.DATA)
                    .into(holder.itemImageView);

下面是我的完整RecycleServiceAdapter类,您可以看到我如何预加载和创建图像:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    private ArrayList<myItems> mMyItems;
    Context mContext;

    public MyAdapter(Context context, ArrayList<Item> myItems){
        mContext = context;
        mMyItems = myItems;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.my_item, parent, false);
        return new MyViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
        MyItem currentItem = mMyItems.get(position);

        final String image1Url = currentItem.getImage1();
        final String image2Url = currentItem.getImage2(); 

        //Preload image1
        Glide.with(mContext)
                .load(image1Url)
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .preload();

        //Preload image2
        Glide.with(mContext)
                .load(image2Url)
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .preload();

        //Display image1  
        Glide.with(mContext)
                .load(image1Url)
                .diskCacheStrategy(DiskCacheStrategy.DATA)
                .into(holder.itemImageView);

        //item onClickListener
        holder.itemImageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //Display image2  
                Glide.with(mContext)
                        .load(image2Url)
                        .diskCacheStrategy(DiskCacheStrategy.DATA)
                        .into(holder.itemImageView);

        });

    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder{

        ImageView itemImageView;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView); 
            itemImageView = itemView.findViewById(R.id.imageViewItem);
        }
    }

}

延迟只发生在第一次单击按钮时,之后没有延迟,看起来像是图像被缓存了。有人知道怎么修吗?这些图片以.webp文件的形式存储在我的网站上,我也尝试了.png,但也不起作用。
当我从我的项目中的drawable文件夹调用图像时,它可以工作,但这不是我的选项。
当我第一次点击图片的时候,我如何修正这个小的延迟?我是否预装了错误的图像?
编辑
这里有一个新创建的项目来演示这个问题,这样你就可以自己测试它了(延迟只出现在第一次单击时,重启应用程序来重置问题)https://github.com/dafaack/glidedelaybugdemonstration

nwlls2ji

nwlls2ji1#

可能需要添加淡入淡出动画,或者如果要更改图像同步,则需要获取位图。我觉得这不是个好办法。
滑翔v3

Bitmap myBitmap = Glide.with(applicationContext)
        .load(yourUrl)
        .asBitmap()
        .into(500, 500)
        .get();

imageView.setBitmap(myBitmap);

滑动v4

FutureTarget<Bitmap> futureBitmap = Glide.with(applicationContext)
        .asBitmap()
        .load(yourURL)
        .submit();
Bitmap myBitmap = futureBitmap.get();

imageView.setBitmap(myBitmap);

注意:如果打开strictmode,则此代码需要在后台运行。

相关问题