Задать вопрос
@Comatu

Почему происходит дублирование файлов при загрузке в AsyncTask?

Есть внутренний класс-наследник AsyncTask, с помощью которого я загружаю файлы изображений для дальнейшего показа их в RecyclerView. На вход execute() подаю строковый массив из 9-ти url. В методе doInBackground в цикле происходит загрузка файлов и формирование массива их uri, а затем в onPostExecute - запись массива в файл json.
Каким-то волшебным образом после первого полного цикла загрузки строковый массив url увеличивается ровно вдвое и снова выполняется загрузка файлов, 18-ти штук.
Как устранить такое дублирование, где ошибка? Очень нужна помощь!
public class LoadCoverActivity extends AppCompatActivity {
    String fileNamePath = "filesPath.json";
    String coversFileName = "coverFilesPath.json";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_load_cover);
        String urlsCover = MyJSON.getData(LoadCoverActivity.this, fileNamePath);
        Gson gsonCovers = new Gson();
        Type founderListType = new TypeToken<ArrayList<String>>(){}.getType();
        ArrayList<String> urlsCoverList = gsonCovers.fromJson(urlsCover, founderListType);
        String[] urlsCovers = urlsCoverList.toArray(new String[0]);
        CoverLoader coverLoader = new CoverLoader();
        coverLoader.execute(urlsCovers);

    }

    private class CoverLoader extends AsyncTask<String, Void, ArrayList<String>> {

        @Override
        protected void onPreExecute() {
        }

        @Override
        protected ArrayList<String> doInBackground(String... urlsFiles) {
            ArrayList<String> coversFiles = new ArrayList<>();
            for (int i = 0; i < urlsFiles.length; i++) {
                int d = i + 1;
                String nameForWrite = "bookcover_" + d + ".jpg";
                String urlCover = urlsFiles[i];
                String filePath = downloadFile(urlCover, nameForWrite);
                coversFiles.add(filePath);
            }
            return coversFiles;
        }

        @Override
        protected void onPostExecute(ArrayList<String> coversFiles) {
            String strJs = new Gson().toJson(coversFiles);
            MyJSON.saveData(getApplicationContext(), strJs, coversFileName);
            nextActivity();
        }
    }

    private void nextActivity() {
        Intent intent = new Intent(LoadCoverActivity.this, MainActivity.class);
        startActivity(intent);
        finish();
    }

    public ArrayList<String> getFilesPathFromFile(String jsResult) {
        ArrayList<String> urlsImg = new ArrayList<>();

        try {
            JSONArray rootJson = new JSONArray(new JSONTokener(jsResult));
            for (int i = 0; i < rootJson.length(); i++) {
                JSONObject o = rootJson.getJSONObject(i);
                String strTo = (String) o.get("uriString");
                urlsImg.add(strTo);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return urlsImg;
    }

    private String downloadFile(String fileURL, String fileName) {
        String rootDir = String.valueOf(getFilesDir());
        try {
            File rootFile = new File(rootDir);
            if (!rootFile.exists()) {
                rootFile.mkdir();
            }
            URL url = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) url.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File(rootFile,
                    fileName));
            InputStream in = c.getInputStream();
            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }
            f.close();
        } catch (IOException e) {
            Log.d("Error....", e.toString());
        }
        String filePathForWrite = rootDir + File.separator + fileName;
        return filePathForWrite;

    }

}


А вот строковый массив на входе AsyncTask:
["http://***.ru/todbook/book_1/pages/page1.jpg","http://***.ru/todbook/book_2/pages/page1.jpg","http://***.ru/todbook/book_3/pages/page1.jpg","http://***.ru/todbook/book_4/pages/page1.jpg","http://***.ru/todbook/book_5/pages/page1.jpg","http://***.ru/todbook/book_6/pages/page1.jpg","http://***.ru/todbook/book_7/pages/page1.jpg","http://***.ru/todbook/book_8/pages/page1.jpg","http://***.ru/todbook/book_9/pages/page1.jpg"]
  • Вопрос задан
  • 87 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
@Comatu Автор вопроса
Скорее всего, это глюк эмулятора. После его перезагрузки - все работает как надо
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы