在 for 循环中滑动不一致的加载

Glide inconsistent loading in for loop

我正在编写一个 Android 应用程序,我想在其中使用最新的 Glide 4.11.0 显示一致的流。我的想法是,我使用调用 Glide 函数的 for 循环每 100 毫秒显示一个新图像。当我启动我的功能时 loadImageFromURL() 它会运行并随后尽可能快地依次显示所有图像,但我想让它以大约 100 毫秒的时间间隔均匀显示。

我做错了什么?是不是Glide内部线程有问题?

我的代码:

public void loadImageFromURL() {
        Glide.get(this).setMemoryCategory(MemoryCategory.HIGH); //use more RAM than normal
        final long Start = System.currentTimeMillis();

        for (int i = 0; i < 5; imageNumber++) {         //for loop for displaying continuously stream
            if (System.currentTimeMillis() > Start + i * 100) {
                Glide.with(this).asBitmap().load(ImageURL).diskCacheStrategy(DiskCacheStrategy.NONE).override(ScreenSizeX, ScreenSizeY).into(new CustomTarget<Bitmap>(){
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        _imageView.setImageBitmap(resource);
                        imageNumber++;
                    }
                    @Override
                    public void onLoadCleared(@Nullable Drawable placeholder) {

                    }
                });
                i++;
            }
        }
    Glide.get(this).setMemoryCategory(MemoryCategory.NORMAL); //RAM usage back to normal
    }

您的代码存在多个缺陷。 Glide 在单独的线程中下载图像,因此它 运行 独立于您的循环下载代码。一些问题:

  1. 您正在从多个线程操纵 imageNumber。这将导致随机的时间敏感问题。您不应在 onResourceReady
  2. 中递增 imageNumber
  3. 循环将无限循环,直到达到所需时间。这将导致沉重的 CPU 负载,可以通过使用锁、等待或类似方法来解决。

我的建议:尝试使用 this answer 中的解决方案同步加载每张图片。加载图片后,计算您的 "image load break" 还剩多少时间,然后使用 Thread.sleep(milliSeconds) 等待剩余时间。然后你可以更新imageView。

确保您 运行 将此代码放在单独的线程中,并在更新 imageView 时使用 runOnUIThread

您可能可以通过使用 ConcurrentQueue 进一步优化这一点,其中图像的下载全部同时发生,并且单独的消费者线程从队列中获取并在其间等待。不过,这可能会占用更高的内存,因为图像也会存储在队列中。