在recyclerview中高效下载和使用图像

时间:2016-10-16 22:12:18

标签: java android image download android-recyclerview

目前我正在使用它来下载和显示我的recyclerview中的图像:

private class RetrieveImageTask extends AsyncTask<URL,Void,Drawable>{
    URL url;
    InputStream inputStream;
    protected Drawable doInBackground(URL... urls){
        url = urls[0];
        try {
            inputStream = (InputStream)url.getContent();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Drawable.createFromStream(inputStream, null);
    }
    protected void onPostExecute(Drawable drawable) {

    }
}

然后我在我的RecyclerViewAdapter中使用onBindViewHolder中的这个类:

@Override
public void onBindViewHolder(ItemViewHolder item, int i) {
    try {
        item.title.setText(aushangdata.getJSONObject(i).getString("title"));
        item.desc.setText(aushangdata.getJSONObject(i).getString("text"));
        item.tag.setText(aushangdata.getJSONObject(i).getString("category"));
        item.link.setText(aushangdata.getJSONObject(i).getString("link"));
        URL myUrl = new URL(aushangdata.getJSONObject(i).getString("image"));
        RetrieveImageTask task = new RetrieveImageTask();
        Drawable drawable = task.execute(myUrl).get();
        item.thumb.setImageDrawable(drawable);
    } catch (JSONException | IOException | InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}

这显然是一个非常糟糕的解决方案,而且非常明显:当我打开包含recyclerview的片段时,我得到的滞后时间最长为0.5秒,当我快速向下滚动时,它也会滞后,因为图像在卡片上占用了大量空间。

我的问题是:在RecyclerView下下载和显示图片的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用Glide:https://github.com/bumptech/glide

使用起来也很简单:

Glide.with(CONTEXT).load(URL or DRAWABLE).asBitmap().into(IMAGEVIEW);

查看维基以获取更多选项:https://github.com/bumptech/glide/wiki

在您的代码中:

Glide.with(context).load(myUrl).asBitmap().into(item.thumb);

希望它有所帮助。

答案 1 :(得分:1)

我和毕加索有类似的问题。我上面的答案是正确的。您可能会考虑的其他事项:我为改善加载时间所做的是使用方法resizecenterCrop

resize(xxx,xxx).

centerCrop().
into(IMAGEVIEW);
滑翔可能有类似的方法。