使用 Glide 进行多任务处理
Multitasking with Glide
我有一个 Android 应用程序,它应该可以在线和离线运行,我正在使用 Glide 加载图像。下载数据库后,我想同时开始两项任务:将所有图像下载到磁盘并加载当前屏幕(然后是下一个屏幕)所需的所有图像。问题是要下载的图像量非常大,当前屏幕请求的图像似乎被添加到同一个下载队列的末尾。所以我最终得到 "empty" 屏幕,直到所有图像都下载到磁盘缓存中。如何让这些任务并行工作?
public class GlideActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_glide);
downloadAllImages();
updateUi();
}
private void updateUi() {
ImageView imageView1 = (ImageView) findViewById(R.id.image_view1);
ImageView imageView2 = (ImageView) findViewById(R.id.image_view2);
ImageView imageView3 = (ImageView) findViewById(R.id.image_view3);
cachedGlideRandomRequest().into(imageView1);
cachedGlideRandomRequest().into(imageView2);
cachedGlideRandomRequest().into(imageView3);
}
private void downloadAllImages() {
for (int i = 0; i < 50; i++) {
cachedGlideRandomRequest().preload();
}
}
private DrawableRequestBuilder<String> cachedGlideRandomRequest() {
return Glide.with(getApplicationContext())
.load("https://unsplash.it/200/300?image=" + System.nanoTime() % 1000)
.diskCacheStrategy(DiskCacheStrategy.SOURCE);
}
}
我想要的是在 downloadAllImages()
仍在后台工作时在 ImageView 上显示图像。
您可以将占位符图像设置为立即显示:
cachedGlideRandomRequest()
.placeholder(R.drawable.resource_to_show_now)
.into(imageView1);
看来 Glide 确实为我的案例提供了一个优雅的解决方案。那就是 priority()
方法。它允许为 "download all" 图像设置低优先级,为 "on screen" 图像设置立即优先级。这是一些 reading about this API。我结束的代码是:
private void downloadAll(List<String> imageUrls) {
for (String image : imageUrls) {
Glide.with(this).load(image).priority(Priority.LOW).preload();
}
}
private void downloadOnScreen(ImageView imageView, String imageUrl) {
Glide.with(this).load(imageUrl).priority(Priority.IMMEDIATE).into(imageView);
}
我有一个 Android 应用程序,它应该可以在线和离线运行,我正在使用 Glide 加载图像。下载数据库后,我想同时开始两项任务:将所有图像下载到磁盘并加载当前屏幕(然后是下一个屏幕)所需的所有图像。问题是要下载的图像量非常大,当前屏幕请求的图像似乎被添加到同一个下载队列的末尾。所以我最终得到 "empty" 屏幕,直到所有图像都下载到磁盘缓存中。如何让这些任务并行工作?
public class GlideActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_glide);
downloadAllImages();
updateUi();
}
private void updateUi() {
ImageView imageView1 = (ImageView) findViewById(R.id.image_view1);
ImageView imageView2 = (ImageView) findViewById(R.id.image_view2);
ImageView imageView3 = (ImageView) findViewById(R.id.image_view3);
cachedGlideRandomRequest().into(imageView1);
cachedGlideRandomRequest().into(imageView2);
cachedGlideRandomRequest().into(imageView3);
}
private void downloadAllImages() {
for (int i = 0; i < 50; i++) {
cachedGlideRandomRequest().preload();
}
}
private DrawableRequestBuilder<String> cachedGlideRandomRequest() {
return Glide.with(getApplicationContext())
.load("https://unsplash.it/200/300?image=" + System.nanoTime() % 1000)
.diskCacheStrategy(DiskCacheStrategy.SOURCE);
}
}
我想要的是在 downloadAllImages()
仍在后台工作时在 ImageView 上显示图像。
您可以将占位符图像设置为立即显示:
cachedGlideRandomRequest()
.placeholder(R.drawable.resource_to_show_now)
.into(imageView1);
看来 Glide 确实为我的案例提供了一个优雅的解决方案。那就是 priority()
方法。它允许为 "download all" 图像设置低优先级,为 "on screen" 图像设置立即优先级。这是一些 reading about this API。我结束的代码是:
private void downloadAll(List<String> imageUrls) {
for (String image : imageUrls) {
Glide.with(this).load(image).priority(Priority.LOW).preload();
}
}
private void downloadOnScreen(ImageView imageView, String imageUrl) {
Glide.with(this).load(imageUrl).priority(Priority.IMMEDIATE).into(imageView);
}