下载后图像正在我的画廊中替换

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”。为防止替换旧图像,您可以执行以下任一操作:

  1. 将“ii”设为全局变量,这样 ii 就不会每次都初始化。
  2. 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());