我创建了一个AsyncTask类,该类获取了我的最新更新。 一切正常,但在doInBackground方法后立即调用onPostExecute方法,但下载没完成!
我该怎么办呢?
public class UpdateApp extends AsyncTask<String,Void,Void>{
private Context context;
public void setContext(Context contextf){
context = contextf;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory()
+ "/Updates/update"+now+".apk")), "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // without this flag android returned a intent error!
context.startActivity(intent);
rotateimageview.stopAnimation();
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
rotateimageview.startAnimation();
super.onPreExecute();
}
@SuppressLint("SimpleDateFormat")
@Override
protected Void doInBackground(String... arg0) {
String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
String now = sdf.format(cal.getTime());
String url = arg0[0];;
File direct = new File(Environment.getExternalStorageDirectory()
+ "/Updates");
if (!direct.exists()) {
direct.mkdirs();
}
DownloadManager mgr = (DownloadManager) getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
Uri downloadUri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(
downloadUri);
request.setAllowedNetworkTypes(
DownloadManager.Request.NETWORK_WIFI
| DownloadManager.Request.NETWORK_MOBILE)
.setAllowedOverRoaming(false).setTitle(getResources()
.getString(R.string.updating_downloadmanager_title).toString())
.setDescription(getResources().getString(R.string.updating_downloadmanager_des).toString())
.setDestinationInExternalPublicDir("/Updates", "update"+now+".apk");
mgr.enqueue(request);
return null;
}
}
答案 0 :(得分:0)
那是因为enqueue(request)
方法是异步的,这意味着它即使没有完成工作也会立即返回。因此,即使下载仍在进行中,也会调用onPostExecute。
我的建议是完全摆脱AsyncTask,因为无论如何请求都是在后台处理的。
要知道下载何时完成,请使用BroadcastReceiver。查看this article以获得一个好例子。
答案 1 :(得分:0)
使用DownloadManager排队时,排队调用会立即返回(因此看起来您的任务已完成)。
有两种可能的解决方法: