Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用Glide进行多任务处理_Android_Android Glide - Fatal编程技术网

Android 使用Glide进行多任务处理

Android 使用Glide进行多任务处理,android,android-glide,Android,Android Glide,我有一个Android应用程序,可以在线和离线工作,我正在使用Glide加载图像。下载数据库后,我想同时启动两个任务:将所有图像下载到磁盘,并加载当前屏幕和下一屏幕上所需的所有图像。问题是要下载的图像数量非常大,当前屏幕上请求的图像似乎添加到同一下载队列的末尾。因此,在所有图像下载到磁盘缓存之前,我的屏幕都是空的。如何使这些任务并行工作 public class GlideActivity extends AppCompatActivity { @Override protec

我有一个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);
    }
}

我想要的是在ImageView上显示图像,而下载的图像仍在后台工作。

您可以将占位符图像设置为立即显示:

cachedGlideRandomRequest()
    .placeholder(R.drawable.resource_to_show_now)
    .into(imageView1);

您可以将占位符图像设置为立即显示:

cachedGlideRandomRequest()
    .placeholder(R.drawable.resource_to_show_now)
    .into(imageView1);

看来Glide确实为我的案例提供了一个优雅的解决方案。这是优先级方法。它允许设置所有下载的低优先级和屏幕图像的即时优先级。这里有一些。我最后的代码是:

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);
}

看来Glide确实为我的案例提供了一个优雅的解决方案。这是优先级方法。它允许设置所有下载的低优先级和屏幕图像的即时优先级。这里有一些。我最后的代码是:

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);
}

不完全是我要搜索的,但是很好的解决方法。你到底在寻找什么?我正在尝试创建两个下载队列或两个Glide实例。然后,我就可以下载所有服务中的图像,同时仍然可以下载活动所需的图像。如果队列按照您怀疑的方式工作,那么在下载图像之前调用updateUI是不起作用的?它适用于此活动,但在移动到下一个活动之后,下载队列似乎要加载很长一段时间。而且图像只有在下载完成后才会出现在UI上。这不完全是我要搜索的,而是很好的解决方法。你到底在寻找什么?我正在尝试创建两个下载队列或两个Glide实例。然后,我就可以下载所有服务中的图像,同时仍然可以下载活动所需的图像。如果队列按照您怀疑的方式工作,那么在下载图像之前调用updateUI是不起作用的?它适用于此活动,但在移动到下一个活动之后,下载队列似乎要加载很长一段时间。只有在下载完成后,图像才会显示在UI上。