У меня многократная работа asynctask в цикле for внутри моего заставки. Я хочу, чтобы приложение прекратило выполнение до тех пор, пока все asynctasks не будут завершены. И я хотел бы обновить поток пользовательского интерфейса с общим количеством задач async и задачи. Если у вас 3 задачи и 1 завершен, я бы хотел отобразить 1/3 завершено. Это код цикла: -Как остановить выполнение до тех пор, пока все задачи async не закончат выполнение в android?
String[] images = Parse_imgJSON.image;
for (int i = 0; i < images.length; i++) {
Log.d("Image ", images[i]);
download_img(images[i]);
}
Код для download_img(): -
public void download_img(String img_url) {
String fileName = img_url.substring(img_url.lastIndexOf('/') + 1, img_url.length());
File file = new File("/storage/emulated/0/rready_images/" + fileName);
if (file.exists() && !file.isDirectory()) {
Log.d("Image exists", fileName);
} else {
if (fileName.contains(".jpg") || fileName.contains(".gif") || fileName.contains(".png")) {
new DownloadImagesAsync().execute(img_url);
} else {
Log.d("IMAGE DOWNLOAD ", "FAILED FOR " + fileName);
}
}
}
Фактический код Асинхронный Задача для скачивания файла: -
class DownloadImagesAsync extends AsyncTask<String, String, String> {
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
private String resp;
int lengthOfFile;
@Override
protected String doInBackground(String... params) {
int count;
try {
URL url = new URL(params[0]);
URLConnection connection = url.openConnection();
connection.connect();
lengthOfFile = connection.getContentLength();
Log.d("ANDRO_ASYNC", "LENGTH OF FILE : " + lengthOfFile);
String fileName = params[0].substring(params[0].lastIndexOf('/') + 1, params[0].length());
Log.d("FILENAME", fileName);
resp = fileName;
if (isSDPresent) {
InputStream inputStream = new BufferedInputStream(url.openStream());
OutputStream outputStream = new FileOutputStream("sdcard/rreadyreckoner_images/" + fileName);
byte data[] = new byte[1024];
long total = 0;
while ((count = inputStream.read(data)) != -1) {
total += count;
outputStream.write(data, 0, count);
}
outputStream.flush();
outputStream.close();
inputStream.close();
} else {
InputStream inputStream = new BufferedInputStream(url.openStream());
OutputStream outputStream = new FileOutputStream(getFilesDir() + "/rreadyreckoner_images/" + fileName);
byte data[] = new byte[1024];
long total = 0;
while ((count = inputStream.read(data)) != -1) {
total += count;
outputStream.write(data, 0, count);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return params[0];
}
@Override
protected void onPostExecute(String filename) {
Log.d("PARAM", filename + " Downloaded ");
String fname = filename.substring(filename.lastIndexOf('/') + 1, filename.length());
Log.d("LENGTH OF FILE : ", String.valueOf(lengthOfFile));
if (isSDPresent) {
File f = new File("/storage/emulated/0/rreadyreckoner_images/" + fname);
if (f.length() < lengthOfFile) {
if (f.delete()) {
// Toast.makeText(RReadySplash.this, "Download was interrupted please try again!", Toast.LENGTH_SHORT).show();
Log.d("Del", "File deleted");
} else {
Log.d("NOTDel", "File not deleted");
}
} else {
// dbHandler.updateDownloadStatus(image_id, "YES");
}
} else {
File f = new File("/storage/emulated/0/rreadyreckoner_images/" + fname);
if (f.length() < lengthOfFile) {
if (f.delete()) {
Log.d("Del", "File deleted");
} else {
Log.d("NOTDel", "File not deleted");
}
} else {
// dbHandler.updateDownloadStatus(image_id, "YES");
}
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
Log.d("ANDRO_ASYNC", values[0]);
}
}
Любая помощь или предложение приветствуется. Спасибо.
Вы должны использовать onPreExecute() в каждой задаче, чтобы приостановить то, что вам нужно сделать паузу, а затем в onPostExecute() использовать статическую переменную для увеличения количества выполненных задач (int i); e.g -> tv.setText (++ i + "/ 3"); – Lazai
Если вы хотите проверить выполнение, сделайте это в 'onPostExecute', а не сделайте это в' onPreExecute'. –