Android Picasso - 在ImageView中查看之前在本地保存图像

时间:2016-05-06 07:23:59

标签: android save picasso

我制作了一个显示图片列表的应用。但之前,我将所有图像下载到SD卡中,然后显示一个包含下载文件数量的进度对话框。我想用Picasso来优化这个过程,因为要下载很多图像。所以没有进度对话框。使用Picasso,我想将图像保存在我的app目录中(作为正常下载的文件),然后才能在ImageView中显示。我想用这个代码:

Picasso picassoInstance = new Picasso.Builder(context)
 .downloader(new CustomDownloader(context, destination))
 .build();

CustomDownloader:

public class CustomDownloader extends OkHttpDownloader {

    private File destination;

    public CustomDownloader(Context context, File destination){
        super(context);
        this.destination = destination;
    }

    @Override
    public Response load(Uri uri, boolean localCacheOnly) throws IOException {
        Response response = super.load(uri, networkPolicy);

        FileOutputStream fileOutput = new FileOutputStream(destination);
        InputStream inputStream = response.getInputStream();

        byte[] buffer = new byte[1024];
        int bufferLength;
        while ((bufferLength = inputStream.read(buffer)) > 0) {
            fileOutput.write(buffer, 0, bufferLength);
        }
        fileOutput.close();

        return response;
    }
}

最后,我使用此语句在ImageView中加载图像:

picassoInstance.load(item.getItem().getPath()).resize(width,0).into(imageView);

我使用这种实现是否正确?或者你能提供另一种方式吗?

编辑1:我使用上面的代码但是ImageView中没有显示图像,即使我看到SDCARD中下载的图像。

编辑2:使用此代码,使用新的线程:

@Override
public Response load(Uri uri, boolean localCacheOnly) throws IOException {
    Response response = super.load(uri, networkPolicy);
    new Thread(new Runnable() {
        try {
            FileOutputStream fileOutput = new FileOutputStream(destination);
            InputStream inputStream = response.getInputStream();

            byte[] buffer = new byte[1024];
            int bufferLength;
            while ((bufferLength = inputStream.read(buffer)) > 0) {
                fileOutput.write(buffer, 0, bufferLength);
            }
            fileOutput.close();
        } catch(IOException e){
            e.printStackTrace();
        }
    }).start();
    return response;
}

我在此行java.lang.ArrayIndexOutOfBoundsException: src.length=2048 srcPos=2048 dst.length=1024 dstPos=0 length=1024

中有一个while ((bufferLength = inputStream.read(buffer)) > 0)

1 个答案:

答案 0 :(得分:-2)

使用毕加索加载图像是好的,有一些优点,如:

  1. 解压缩图像的内存和磁盘缓存,后处理
  2. 自动创建的单例图像下载程序
  3. 一次多次下载
  4. 但你可以尝试使用Volley,对我来说这是最棒的! 关于你的问题,尝试在logcat中显示item.getItem()。getPath()并查看路径是否正常,如果你想在sdcard中使用图像,路径应该是sdcard中的路径