OnPostExecute вызывается дважды и показывает двойной результат

Я пытаюсь загрузить некоторые файлы в фоновом режиме, для этого я использовал диспетчер загрузок и сделал этот метод:

/*** media download ***/
    public long mediaDownload(ArrayList<DownloadedFile> arrayList, String foldPathName) {
        long downloadReference = 0;

        // Create request for android download manager
        downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);

        for (int i = 0; i < arrayList.size();i++){

            DownloadManager.Request request = new DownloadManager.Request(arrayList.get(i).getUri());
            request.setTitle("Data Download");
            request.setDescription("New media");

            //Set the local destination for the downloaded file to a path
            //within the application's external files directory
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS + "/" + folder_main + "/" + foldPathName, arrayList.get(i).getName());
            File f = new File(Environment.DIRECTORY_DOWNLOADS + "/" + folder_main + "/" + foldPathName + "/" + arrayList.get(i).getName());
            Log.e("File:",f.toString());

            //Enqueue download and save into referenceId
            downloadReference = downloadManager.enqueue(request);

        }
        return downloadReference;
    }

У меня есть изображение и видео для загрузки для тестирования, и при проверке загруженного файла в проводнике я нахожу 2 видео и 2 изображения, отлаживаю, что я обнаружил, что метод onPostExecute вызывается дважды, и я не могу понять, почему. Вот мой метод onPostExecute:

 protected void onPostExecute(String s) {
                try {
                    JSONObject jsonObject = new JSONObject(s);
                    JSONArray region = null;
                    region = jsonObject.getJSONArray("regions");
                    Log.e("Regions:", String.valueOf(region.length()));
                    for (int i = 0; i < region.length(); i++) {
                        try {
                            JSONObject json_data = region.getJSONObject(i);
                            int height_view = Integer.parseInt(json_data.getString("height"));
                            int width_view = Integer.parseInt(json_data.getString("width"));

                            int left_view = Integer.parseInt(json_data.getString("left"));
                            int top_view = Integer.parseInt(json_data.getString("top"));
                            int right_view = Integer.parseInt(json_data.getString("right"));
                            int bottom_view = Integer.parseInt(json_data.getString("bottom"));

                            /**** Media in region ***/
                            JSONObject media = json_data.getJSONObject("media");
                            String type_media = media.getString("type");

                            url = media.getString("url");
                            name = media.getString("name");
                            uri = Uri.parse(url);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        downloadedFiles.add(new DownloadedFile(name, uri));
                    }
                    Toast.makeText(MainActivity.this, "Layout Created with" + height + "x" + width, Toast.LENGTH_SHORT).show();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Log.e("Downloaded Files:",downloadedFiles.toString());
                mediaDownload(downloadedFiles, folderName); // region media's download
            }

В моем журнале я вижу, что мой arrayList имеет 2 элемента, но отображается дважды, что означает, что файлы загружаются дважды, поэтому метод onPostExecute вызывается 2 раза, спасибо за помощь.

Может вы дважды звоните, проверьте еще раз.

Aditya 17.10.2018 09:52

Нет, это только один раз

Laidi Oussama 17.10.2018 09:59

Разместите полный код того места, где вы его вызываете, и полный класс Async.

SamHoque 17.10.2018 10:07

ваш onPostExecute - это метод, переопределенный в AsyncTask?

Vladyslav Matviienko 17.10.2018 10:07

сначала проверьте размер массива loadedFiles при вызове mediaDownload (loadedFiles, folderName). Затем попробуйте удалить эту строку ... File f = new File (Environment.DIRECTORY_DOWNLOADS + "/" + folder_main + "/" + foldPathName + "/" + arrayList.get (i) .getName ()); Log.e ("Файл:", f.toString ());

kuber singh 17.10.2018 10:09

@VladyslavMatviienko да это так

Laidi Oussama 17.10.2018 10:11

@kubersingh оба они показывают 2 файла, но оба выполняются дважды, потому что они вошли в систему onPostExecute

Laidi Oussama 17.10.2018 10:12

покажите, как вы используете asynctask, тогда

Vladyslav Matviienko 17.10.2018 10:16

проверьте, нет ли вызова asynctask в каком-либо цикле ..

kuber singh 17.10.2018 10:16

я вызываю это в onCreate так: new dispProj().execute(); и там нет петли

Laidi Oussama 17.10.2018 10:17

проверьте отладку с точкой останова, если вы вызываете ее дважды

Vladyslav Matviienko 17.10.2018 10:20

yes может быть дважды вызван oncreate из-за того, что экземпляр Activity Tasks вызывает его дважды.

kuber singh 17.10.2018 10:21

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

Laidi Oussama 17.10.2018 11:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
13
224
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я понял, потратив свое время на отладку всего кода, когда действие создается, оно меняет ориентацию экрана и поэтому создает второй экземпляр, поэтому моя AsyncTask вызывается дважды, и поэтому я подумал, что onPosteExecute вызывается дважды, спасибо всем, кто пытался помочь.

Другие вопросы по теме