我有recyclerview,并且在每个recyclerview物品中都有图像。我在每个recyclerview项目中都有一个下载按钮。
如果用户单击下载按钮,则该recyclerview项目的图像将下载并存储。
直到这里一切正常,现在的问题是,如果用户正在下载第一个产品的图像,并且用户将为下一个产品下载另一个图像,则库中的图像将被替换。
public class DownloadImage extends AsyncTask<String, Void, Void> {
private Context context;
private DownloadImage(Context context) {
this.context = context;
}
@Override
protected Void doInBackground(String... params) {
int ii = 0;
for (int k=0;k<resellerProductLists.get(imgpos).getProductImageDtoList().size();k++) {
//Toast.makeText(context,resellerProductLists.get(0).getProductImageDtoList().get(k).getImageUrl(),Toast.LENGTH_SHORT).show();
Log.e("Image",resellerProductLists.get(imgpos).getProductImageDtoList().get(k).getImageUrl());
ii++;
String img = "IMG-";
String mPath = Environment.getExternalStorageDirectory().toString() + "/Temp/" + img + ii + ".jpg";
File Directory = new File(Environment.getExternalStorageDirectory().toString() + "/Temp");
Directory.mkdirs();
try {
File file = Glide.with(context)
.load(resellerProductLists.get(imgpos).getProductImageDtoList().get(k).getImageUrl())
.downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
.get();
File imageFile = new File(mPath);
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(file));
out = new BufferedOutputStream(new FileOutputStream(mPath));
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
out.flush();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (out != null) {
try {
out.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
} catch (InterruptedException | ExecutionException | IOException e) {
hideLoading();
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(Void res) {
super.onPostExecute(res);
//prodImageUri1.addAll(prodImageUri);
// hideLoading();
Toast.makeText(context,"Download Complete Successfully", Toast.LENGTH_SHORT).show();
}
}
有人可以帮助我解决这个问题吗?
答案 0 :(得分:1)
图库中的图像被替换,因为两个图像具有相同的名称。这是因为变量“ ii”已在“ doInBackgroud()”函数中初始化,因此图像名称始终变为“ ../temp/IMG-1.jpg”。为防止替换旧图像,您可以执行以下任一操作:
int ii=0
替换String ii = System.currentTimeMillis().toString()
,这将确保ii每次都是唯一的。答案 1 :(得分:1)
将此添加到您的代码中,然后再次测试:
String timeStamp = new SimpleDateFormat("HHmmss", Locale.US).format(new Date());
String mPath = Environment.getExternalStorageDirectory().toString() + "/Temp/" + img + ii +timeStamp+ ".jpg";
timeStamp
将为您下载的每个项目生成唯一的基于时间的名称。您可以使用所需的所有内容替换此时间戳记。但是每个项目都必须是唯一的。
例如,您可以在模型类中创建getter/setter
并相应地设置ImageName。
public String getImageName() {
return imageName;
}
public void setImageName(String imageName) {
this.imageName = imageName;
}
private String imageName;
并像这样使用它:
String uniqueName = resellerProductLists.get(imgpos).getProductImageDtoList().get(k).getImageName());