После загрузки изображения заменяются в моей галерее - PullRequest
0 голосов
/ 12 марта 2019

У меня есть просмотрщик, и в каждом элементе просмотра есть изображения.У меня также есть кнопка загрузки в каждом элементе переработчика.

Если пользователь нажмет на кнопку загрузки, изображения этого элемента программы просмотра будут загружены и сохранены.

Пока все работает нормально, теперь проблема в том, что, если пользователь загружает изображение первого продукта, а пользователь загружает другое изображение для следующего продукта, изображения в галерее заменяются.

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 ]

1 голос
/ 12 марта 2019

Добавьте это к своему коду и протестируйте снова:

String timeStamp = new SimpleDateFormat("HHmmss", Locale.US).format(new Date());
String mPath = Environment.getExternalStorageDirectory().toString() + "/Temp/" + img + ii +timeStamp+ ".jpg";

timeStamp будет генерировать уникальное имя на основе времени для каждого элемента, который вы загружаете. Вы можете заменить эту метку времени всем, что хотите но он должен быть уникальным для каждого предмета.

Например, вы можете создать getter/setter в классе вашей модели и соответственно установить setImageName.

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());  
1 голос
/ 12 марта 2019

Изображение в галерее заменяется, поскольку оба изображения имеют одно и то же имя. Это потому, что ваша переменная 'ii' инициализируется внутри функции 'doInBackgroud ()', поэтому имя изображения всегда становится "../temp/IMG-1.jpg". Чтобы предотвратить замену старых изображений, вы можете выполнить одно из следующих действий:

  1. Сделайте 'ii' глобальной переменной, чтобы ii не инициализировалось каждый раз.
  2. Заменить int ii=0 на String ii = System.currentTimeMillis().toString(), это гарантирует, что ii будет уникальным каждый раз.
...