使用Glide v4为AsyncTask中的RecyclerView预加载图像

时间:2018-05-18 11:29:08

标签: android android-recyclerview android-asynctask android-glide

我正在使用Glide v4进行远程图像下载和缓存。我想在AsyncTask中使用Glide和来自服务器的其他数据(如文本)预装RecyclerView图像,在布局中显示进度条而不是RecyclerView。我已经使用

成功完成了这项工作
$("body").on('change', '#enabled, #local, #senior', function() {
    var Check = $(this).attr('id')

然后将drawables存储在内存中,将其应用于OnBindViewHolder()中的ImageView:

Drawable drawable = Glide.with(context)
.load(url)
.submit()
.get();

Hovewer,我知道在内存中存储drawable是无效的,磁盘缓存也不起作用,所以我决定尝试将所有图像下载到AsyncTask中的磁盘缓存:

imageView.setImageDrawable(drawable);

然后通过以下方法在OnBindViewHolder()中检索它们:

Glide.with(context)
.downloadOnly()    
.load(url)
.apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.DATA))
.submit();

但AsyncTask中的预加载或从磁盘缓存加载不起作用,导致在AsyncTask完成后从Web下载图像。经度:

  

Glide:加载失败   http://image.tmdb.org/t/p/w600_and_h900_bestv2/h5n8B12WoY1UAZjzSVEup4vsoBw.jpg   大小[255x255]级   com.bumptech.glide.load.engine.GlideException:无法加载   资源

here开始,我得出结论,从磁盘缓存加载图像失败,因为视图的大小和预加载图像的大小不同。从Glide docs,我假设自动了解ImageView的大小,我需要将图像预加载到所需的ImageView并获取Target对象(但我不确定这个)

Glide.with(context)
.load(url)
.apply(new RequestOptions().onlyRetrieveFromCache(true))
.into(imageView);

然后通过

从OnBindViewHolder()中的缓存中检索图像
Target<Drawable> target = Glide.with(context)
.load(url)
.apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.DATA))
.into(imageView);

但是我不知道如何以及何时将RecyclerView的ViewHolder ImageView的引用传递给AsyncTask的doInBackground(),将视图传递给后台线程是一个好习惯吗?

或者可能有更清晰的背景缓存解决方案然后检索?

1 个答案:

答案 0 :(得分:0)

使用IntentService加载图片。

public class LoadImage extends IntentService {
private CommonData common;
private final String TAG = "LoadAvatar";

@Override
protected void onHandleIntent(@Nullable Intent intent) {
    String data = intent.getStringExtra("data");
    try {
        JSONObject jsonObject = new JSONObject(data);
        JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("res");
        for (int i = 0; i < jsonArray.length(); i++) {

                JSONObject jObj = jsonArray.getJSONObject(i);
                FutureTarget<File> future = Glide.with(this).load(jObj.getString("url")).downloadOnly(400, 400);
                try {
                    future.get();
                    //stopSelf();
                    break;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    stopSelf();
                    break;
                } catch (ExecutionException e) {
                    e.printStackTrace();
                    stopSelf();
                    break;
                }


        }
    } catch (Exception e) {
       e.printStackTrace();
        stopSelf();
    }
}

}

并在开始时调用意向服务。

  Intent i = new Intent(this, LoadAvatar.class);
  i.putExtra("data", data);
  startService(i);