下载后图像正在我的画廊中替换
After Download Images are replacing in my gallery
我有 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();
}
}
谁能帮我解决这个问题?
图库中的图片正在被替换,因为两张图片同名。这是因为您的变量 'ii' 是在 'doInBackgroud()' 函数内部初始化的,因此图像名称总是变为“../temp/IMG-1.jpg”。为防止替换旧图像,您可以执行以下任一操作:
- 将“ii”设为全局变量,这样 ii 就不会每次都初始化。
- 将
int ii=0
替换为String ii = System.currentTimeMillis().toString()
,这将保证每次ii都是唯一的。
将此添加到您的代码中并再次测试:
String timeStamp = new SimpleDateFormat("HHmmss", Locale.US).format(new Date());
String mPath = Environment.getExternalStorageDirectory().toString() + "/Temp/" + img + ii +timeStamp+ ".jpg";
timeStamp
将为您下载的每个项目生成基于时间的唯一名称。你可以用你想要的任何东西替换这个时间戳。但每个项目都必须是唯一的。
例如,您可以在模型 class 中创建一个 getter/setter
并相应地设置图像名称。
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());
我有 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();
}
}
谁能帮我解决这个问题?
图库中的图片正在被替换,因为两张图片同名。这是因为您的变量 'ii' 是在 'doInBackgroud()' 函数内部初始化的,因此图像名称总是变为“../temp/IMG-1.jpg”。为防止替换旧图像,您可以执行以下任一操作:
- 将“ii”设为全局变量,这样 ii 就不会每次都初始化。
- 将
int ii=0
替换为String ii = System.currentTimeMillis().toString()
,这将保证每次ii都是唯一的。
将此添加到您的代码中并再次测试:
String timeStamp = new SimpleDateFormat("HHmmss", Locale.US).format(new Date());
String mPath = Environment.getExternalStorageDirectory().toString() + "/Temp/" + img + ii +timeStamp+ ".jpg";
timeStamp
将为您下载的每个项目生成基于时间的唯一名称。你可以用你想要的任何东西替换这个时间戳。但每个项目都必须是唯一的。
例如,您可以在模型 class 中创建一个 getter/setter
并相应地设置图像名称。
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());