Есть внутренний класс-наследник 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"]