Android异步任务方法执行顺序
我正在使用AsyncTask将一些文件下载到我的应用程序中,当我刷新它们时,我希望可用文件列表能够自行更新。从我在线阅读的内容来看,下载部分将使用“doInBackground”方法完成,之后为了更新视图,我使用了“onPostExecute”方法。当我这样做时,视图不会自动更新,我必须更改活动,然后返回以进行更新,我用来更新视图的方法是有效的,但它似乎是在所有文件下载完成之前被调用的,因此它们不会与可用文件一起显示 如果我错了,请纠正我,但在doInBackground完全完成后是否调用onPostExecute?如果没有,我该怎么做才能在文件下载完成之前不调用onPostExecute 谢谢 以下是我正在使用的代码:Android异步任务方法执行顺序,android,android-asynctask,Android,Android Asynctask,我正在使用AsyncTask将一些文件下载到我的应用程序中,当我刷新它们时,我希望可用文件列表能够自行更新。从我在线阅读的内容来看,下载部分将使用“doInBackground”方法完成,之后为了更新视图,我使用了“onPostExecute”方法。当我这样做时,视图不会自动更新,我必须更改活动,然后返回以进行更新,我用来更新视图的方法是有效的,但它似乎是在所有文件下载完成之前被调用的,因此它们不会与可用文件一起显示 如果我错了,请纠正我,但在doInBackground完全完成后是否调用onP
private class Documents_Task extends AsyncTask<String, String, Boolean> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Boolean doInBackground(String... params) {
try {
// Downloading the documents and savign them
return true;
} catch (Exception e) {
return false;
}
}
@Override
protected void onPostExecute(Boolean success) {
if (success) {
// Displaying the list of available files
}
}
}
我认为您在实际下载完成之前通过了doInBackground的结果。您可以在下载成功后编写返回。这将解决您的问题。您在下载代码中调用的
下载管理器正在为您处理异步下载,下载请求将立即返回。因此,您的doInBackground()
调用在下载完成之前很快返回
要实现您想要的,您可能根本不需要AsyncTask
。相反,您可以设置广播接收器,以便在下载完成时收听DownloadManager广播。请参阅下面的答案和此处链接的代码示例以供参考
您可能需要详细说明您的下载/保存代码。@headuck我已经添加了代码,onSuccess应该添加到哪里?
String result = HttpManager.getData(params[0]);
// Getting the names of the files I already have on my mobile
File folder = (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/EHTProfs/Documents"));
File[] listOfFiles = folder.listFiles();
//String array, each element will correspond to a name of a file on my mobile
String[] names = new String[listOfFiles.length];
//Filling my array
if (listOfFiles.length > 0)
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile())
names[i] = listOfFiles[i].getName();
}
Context c = Documents.this;
// Taking null out of the string result containing the names of the files on my server
String sub_result = result.substring(1, result.length() - 6);
// Comparing each file name on the server with those on my mobile,
// if it exists do nothing, if not download it
StringTokenizer st = new StringTokenizer(sub_result, "\",\"");
Boolean exists;
while (st.hasMoreTokens()) {
exists = false;
String fileName = st.nextToken();
if (names.length > 0)
for (int i = 0; i < names.length; i++) {
if (names[i].equals(fileName)) {
i = names.length;
exists = true;
}
}
if (!exists) {
downloadDocument(fileName);
}
}
public void downloadDocument(String fileName) {
DownloadManager mManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
Uri downloadUri = Uri.parse("http://" + IP_ADDRESS_PORT + "/EhtprofsWEB/ehtprofs/document/" + fileName);
DownloadManager.Request request = new DownloadManager.Request(
downloadUri)
.setAllowedOverRoaming(false)
.setTitle(fileName)
.setDestinationInExternalPublicDir(
Environment.DIRECTORY_DOWNLOADS + "/EHTProfs/Documents", fileName);
mManager.enqueue(request);
}