用volley 批量下载图片,但遇到存放文件路径和名称的问题

Android 码拜 9年前 (2016-03-26) 1006次浏览
先上代码
for (String imgUrl : imgUrls) {
jj = jj + 1;
imgfile = ItemDirPathStr + “/img” + jj + “.jpg”;

ImageRequest imageRequest = new ImageRequest(
imgUrl,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
//  imageView.setImageBitmap(response);
Log.e(tag, “Suc down img” +imgfile  + ” 成功”);
saveMyBitmap(imgfile , response);

}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(tag, “Err down img” + imgfile + ” ” + error.toString());

}
});

mQueue.add(imageRequest);
}
====
问题描述:
为了简化和清楚,举例来说:
imgUrls里有10个url,分别对应10个图片的网址。
用for循环来,一个一个的new ImageRequest ,并加入mQueue。
图片都能正常下载下来。
但是,下载的文件名,只是最后一个循环的。例如:都为img10.jpg,结果就是,只保存了最后一个图片,其他的都被覆盖了。
像这种情况,应该怎么样让其以给定的文件名来保存呢?
谢谢

解决方案

30

图片是在线程中下载的,而imgfile变量是在主线程中的,当图片下载下来的时候主线程已经把for循环执行完了,imgfile的值已经变成了img10.jpg,因此图片都是同一个名字,下载并保存会互相覆盖。要解决这个问题也很简单,在下载线程中保存各自下载图片的名字就可以了,例如这里可以在new出来的Response.Listener对象中设置一个变量保存文件名。

5

文件名可以用md5(url)来做保证图片名的唯一性

5

请求同时发出,但都是异步的,先请求的不一定是先执行完的,所以,存在你这个问题。
同样的道理,假如按你这种命名方式,把名称放到listener中,也会出现这个问题。
所以,命名规则要变动一下。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明用volley 批量下载图片,但遇到存放文件路径和名称的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)