我有一个Android应用程序,可以同时在线和离线使用,并且我正在使用Glide进行图像加载。下载数据库之后,我要并行执行两个任务:将所有图像下载到磁盘上,并在当前屏幕(然后是下一屏幕)上加载所需的所有图像。问题在于要下载的图像数量非常大,并且当前屏幕请求的图像似乎已添加到同一下载队列的末尾。因此,我最终看到“空白”屏幕,直到所有图像都下载到磁盘缓存中。如何使这些任务并行工作?

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()仍在背景上工作时在ImageViews上显示图像。

最佳答案

看来Glide对于我的情况确实有一个优雅的解决方案。那就是priority()方法。它允许为“全部下载”设置低优先级,为“屏幕上”图像设置即时优先。这是一些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);
}

10-08 03:08