如何在我的代码中添加进度通知以进行下载

时间:2018-08-17 14:13:40

标签: android

我已经在此应用程序中创建了一个应用程序,我已显示pdf文件,当用户单击该文件时应下载文件。我编写了下载代码,但我只能显示ProgressDialog进行下载,但我希望进度通知与取消按钮。我不知道该怎么做。

这是我的下载代码。

  public class DownloadTask {
    private static final String TAG = "Download Task";
    private Context context;
    private String downloadUrl = "", downloadFileName = "";
    private ProgressDialog progressDialog;
    @RequiresApi(api = Build.VERSION_CODES.CUPCAKE)
    public DownloadTask(Context context, String downloadUrl, String downloadFileName) {
        this.context = context;
        this.downloadUrl = downloadUrl;
        this.downloadFileName =downloadFileName;
        new DownloadingTask().execute();
    }

    private class DownloadingTask extends AsyncTask<Void, Void, Void> {

        File apkStorage = null;
        File outputFile = null;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
          progressDialog = new ProgressDialog(context);
          progressDialog.setMessage("Loading...");
          progressDialog.setCanceledOnTouchOutside(false);
               progressDialog.setCancelable(false);
            progressDialog.show();

        }
      @Override
        protected void onPostExecute(Void result) {
            try {
                if (outputFile != null) {
                progressDialog.dismiss();
                   Toast.makeText(context, "Downloaded Successfully", Toast.LENGTH_SHORT).show();
                    File file = new File(Environment.getExternalStorageDirectory() + "/"
                            + "android"+"/"+"data"+"/"+"FolderName"+"/"+ downloadFileName);
                   StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
                    StrictMode.setVmPolicy(builder.build());
                    Uri uri = Uri.fromFile(file);

                    Intent intent = new Intent(Intent.ACTION_VIEW);
                                      if (uri.toString().contains(".pdf")) {
                              intent.setDataAndType(uri, "application/pdf");
                    }
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intent);


                } else {

                    new Handler().postDelayed(new Runnable() {
                        @Override
                        public void run() {

                        }
                    }, 3000);
                        Log.e(TAG, "Download Failed");
                }
            } catch (Exception e) {
                e.printStackTrace();
                 new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                    }
                }, 3000);
                Log.e(TAG, "Download Failed with Exception - " + e.getLocalizedMessage());

            }
            super.onPostExecute(result);
        }
        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                URL url = new URL(downloadUrl);
                HttpURLConnection c = (HttpURLConnection) url.openConnection();
                c.setRequestMethod("GET");
                c.connect();//connect the URL Connection
          if (c.getResponseCode() != 
               HttpURLConnection.HTTP_OK) {
                    Log.e(TAG, "Server returned HTTP " + c.getResponseCode()
                            + " " + c.getResponseMessage());
                    }
                 if (new CheckForSDCard().isSDCardPresent()) {

                    apkStorage = new File(
                            Environment.getExternalStorageDirectory() + "/"
                                  + "android"+"/"+"data"+"/"+"Folder name");
                } else
                    Toast.makeText(context, "Oops!! There is no SD Card.", Toast.LENGTH_SHORT).show();
                    if (!apkStorage.exists()) {
                    apkStorage.mkdir();
                    Log.e(TAG, "Directory Created.");
                }

                outputFile = new File(apkStorage, downloadFileName);
 if (!outputFile.exists()) {
                    outputFile.createNewFile();
                    Log.e(TAG, "File Created");
                }

                FileOutputStream fos = new FileOutputStream(outputFile);    
                InputStream is = c.getInputStream();    
                byte[] buffer = new byte[1024];//Set buffer type
                int len1 = 0;//init length
                while ((len1 = is.read(buffer)) != -1) {
                    fos.write(buffer, 0, len1);//Write new file
                }

                 fos.close();
                is.close();

            } catch (Exception e) {
                  e.printStackTrace();
                outputFile = null;
                Log.e(TAG, "Download Error Exception " + e.getMessage());
            }

            return null;
        }
    }

1 个答案:

答案 0 :(得分:0)

doInBackground的{​​{1}}方法中,定期调用downloadingTask将进度传输到您的UI,然后在publishProgress上更新进度条,并在UI线程,因此可以在对话框中显示进度条。