我自己网站上的软件更新

时间:2014-02-20 17:00:47

标签: android android-asynctask auto-update

我创建了一个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;    
}  


}

2 个答案:

答案 0 :(得分:0)

那是因为enqueue(request)方法是异步的,这意味着它即使没有完成工作也会立即返回。因此,即使下载仍在进行中,也会调用onPostExecute。

我的建议是完全摆脱AsyncTask,因为无论如何请求都是在后台处理的。

要知道下载何时完成,请使用BroadcastReceiver。查看this article以获得一个好例子。

答案 1 :(得分:0)

使用DownloadManager排队时,排队调用会立即返回(因此看起来您的任务已完成)。

有两种可能的解决方法:

  1. 使用DownloadManager的首选方法是在下载完成时实现广播接收器以接收广播。正如Merlevede指出的那样,你甚至不使用AsyncTask。
  2. 如果您真的需要保持异步任务或者不想实现广播接收器,那么<​​em>可以在您的doInBackground中循环并查询下载管理器以检查状态,希望在两者之间休息一段时间检查。鉴于轮询和睡眠的必要性,这真的不应该是一个首选的选择(理论上,如果应用程序放在后台,你的任务可能被O / S杀死,所以你不能保证得到结果)。