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

时间:2019-03-12 10:30:41

标签: android image file android-internal-storage

我有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();
        }
    }

有人可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

图库中的图像被替换,因为两个图像具有相同的名称。这是因为变量“ ii”已在“ doInBackgroud()”函数中初始化,因此图像名称始终变为“ ../temp/IMG-1.jpg”。为防止替换旧图像,您可以执行以下任一操作:

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