【发布时间】:2016-09-02 09:13:00
【问题描述】:
我有多个异步任务在我的初始屏幕内的 for 循环中运行。我希望应用程序停止执行,直到所有异步任务完成。我想用异步任务和任务完成的总数更新 UI 线程。就像有 3 个任务和 1 个完成我想显示 1 /3 完成。 这是循环的代码:-
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);例如 -> tv.setText(++i + "/3");
-
如果您想检查是否完成,请在
onPostExecute中进行,而不是在onPreExecute中进行。
标签: java android multithreading asynchronous android-asynctask