在后台线程中加载与缓存数据

为了使后台加载资源和与媒体交互更加容易,除了Glide.with(fragment).load(url).into(view)这个API外,Glide还提供了额外两个API。

  • downloadOnly(int, int)
  • into(int, int)

downloadOnly方法

Glide的downloadOnly(int, int)方法允许你把图片bytes下载到磁盘缓存中,以便以后获取使用。你可以在UI线程异步地调用downloadOnly(),也可以在后台线程同步的使用。但是,注意他们的参数有些不同,异步API的参数是Target,同步api的参数是宽和高的整数值。 为了在后台线程下载图片,你必须使用同步方法

FutureTarget<File> future = Glide.with(applicationContext)
    .load(yourUrl)
    .downloadOnly(500, 500);
File cacheFile = future.get();

当future返回时,图片的bytes数据就在缓存中可用了。一种典型的情况是,你使用downloadOnly()API只是为了确保数据下载到了磁盘上。一般情况下,虽然你有权访问底层的缓存文件,但是你不需要直接和它交互。 而是,当你想要获取这个图片时,你只要像平常加载图片时那样调用就行,只有一点不同

Glide.with(yourFragment)
    .load(yourUrl)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(yourView);

通过传入 DiskCacheStrategy.ALL或者DiskCacheStrategy.SOURCE,确保Glide可以使用你通过downloadOnly()下载的数据。

into方法

如果你想在一个后台线程与一张已经解码的图片交互。你可以使用这个版本的into()方法来返回一个FutureTarget。例如,获取一张中心剪裁后的500*500像素的图片:

Bitmap myBitmap = Glide.with(applicationContext)
    .load(yourUrl)
    .asBitmap()
    .centerCrop()
    .into(500, 500)
    .get()

虽然into(int, int)方法在后台线程中很有效,但是,你不能把它用在主线程中。即使这个同步方法在你的主线程中不会抛出异常,调用get()也会阻塞主线程。会使你的APP性能变差,反应迟钝。