Я пытаюсь загрузить некоторые файлы в фоновом режиме, для этого я использовал диспетчер загрузок и сделал этот метод:
/*** 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 раза, спасибо за помощь.
Нет, это только один раз
Разместите полный код того места, где вы его вызываете, и полный класс Async.
ваш onPostExecute - это метод, переопределенный в AsyncTask?
сначала проверьте размер массива loadedFiles при вызове mediaDownload (loadedFiles, folderName). Затем попробуйте удалить эту строку ... File f = new File (Environment.DIRECTORY_DOWNLOADS + "/" + folder_main + "/" + foldPathName + "/" + arrayList.get (i) .getName ()); Log.e ("Файл:", f.toString ());
@VladyslavMatviienko да это так
@kubersingh оба они показывают 2 файла, но оба выполняются дважды, потому что они вошли в систему onPostExecute
покажите, как вы используете asynctask, тогда
проверьте, нет ли вызова asynctask в каком-либо цикле ..
я вызываю это в onCreate так: new dispProj().execute(); и там нет петли
проверьте отладку с точкой останова, если вы вызываете ее дважды
yes может быть дважды вызван oncreate из-за того, что экземпляр Activity Tasks вызывает его дважды.
Я проверил с помощью точки останова, я не могу понять, почему он вызывается дважды, и у меня нет другого цикла




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