我制作了一个显示图片列表的应用。但之前,我将所有图像下载到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)
答案 0 :(得分:-2)
使用毕加索加载图像是好的,有一些优点,如:
但你可以尝试使用Volley,对我来说这是最棒的! 关于你的问题,尝试在logcat中显示item.getItem()。getPath()并查看路径是否正常,如果你想在sdcard中使用图像,路径应该是sdcard中的路径