在 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 在单独的线程中下载图像,因此它 运行 独立于您的循环下载代码。一些问题:
- 您正在从多个线程操纵
imageNumber
。这将导致随机的时间敏感问题。您不应在 onResourceReady
中递增 imageNumber
- 循环将无限循环,直到达到所需时间。这将导致沉重的 CPU 负载,可以通过使用锁、等待或类似方法来解决。
我的建议:尝试使用 this answer 中的解决方案同步加载每张图片。加载图片后,计算您的 "image load break" 还剩多少时间,然后使用 Thread.sleep(milliSeconds)
等待剩余时间。然后你可以更新imageView。
确保您 运行 将此代码放在单独的线程中,并在更新 imageView 时使用 runOnUIThread
。
您可能可以通过使用 ConcurrentQueue 进一步优化这一点,其中图像的下载全部同时发生,并且单独的消费者线程从队列中获取并在其间等待。不过,这可能会占用更高的内存,因为图像也会存储在队列中。
我正在编写一个 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 在单独的线程中下载图像,因此它 运行 独立于您的循环下载代码。一些问题:
- 您正在从多个线程操纵
imageNumber
。这将导致随机的时间敏感问题。您不应在onResourceReady
中递增 - 循环将无限循环,直到达到所需时间。这将导致沉重的 CPU 负载,可以通过使用锁、等待或类似方法来解决。
imageNumber
我的建议:尝试使用 this answer 中的解决方案同步加载每张图片。加载图片后,计算您的 "image load break" 还剩多少时间,然后使用 Thread.sleep(milliSeconds)
等待剩余时间。然后你可以更新imageView。
确保您 运行 将此代码放在单独的线程中,并在更新 imageView 时使用 runOnUIThread
。
您可能可以通过使用 ConcurrentQueue 进一步优化这一点,其中图像的下载全部同时发生,并且单独的消费者线程从队列中获取并在其间等待。不过,这可能会占用更高的内存,因为图像也会存储在队列中。