如何取消运行下载文件?

时间:2016-06-23 04:59:44

标签: android download

我想从通知区域取消当前的下载文件&我想在通知下载进度的底部添加取消按钮。通过单击该取消按钮,应取消下载。这是我的课程 DownloadSong 使用我执行下载文件。我需要做哪些修改?

public class DownloadSong extends AsyncTask<String, Integer, String> {

Activity activity;
public static String songName, songURL;

private NotificationHelper mNotificationHelper;
public static int notificationID = 1;
boolean download = false;
NotificationManager nm;

public DownloadSong(Activity activity, String songName, String songURL) {
    this.activity = activity;
    this.songName = songName;
    this.songURL = songURL;

    mNotificationHelper = new NotificationHelper(activity, songName);
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

    notificationID++;
    mNotificationHelper.createNotification(notificationID);
}

@Override
protected String doInBackground(String... file_URL) {

    try {
        URL url = new URL(songURL);
        HttpURLConnection URLconnection = (HttpURLConnection) url.openConnection();
        URLconnection.setRequestMethod("GET");
        URLconnection.setDoOutput(true);
        URLconnection.connect();

        // Detect the file length
        int fileLength = URLconnection.getContentLength();

        File fSDcard = Environment.getExternalStorageDirectory();
        String strSdcardPath = fSDcard.getAbsolutePath();

        File fDirectory = new File(strSdcardPath + "/GSD");

        if (!fDirectory.exists()) {
            fDirectory.mkdir();
        }

        File fMyFile = new File(fDirectory.getAbsolutePath() + "/" + songName + ".mp3");
        Log.e("Download file name ", fMyFile.toString());

        FileOutputStream out = new FileOutputStream(fMyFile, true);

        InputStream input_File = URLconnection.getInputStream();

        byte[] data = new byte[1024];
        int total = 0;
        int count;

        while ((count = input_File.read(data)) != -1) {

            total += count;
            publishProgress((int) (total * 100 / fileLength));

            out.write(data, 0, count);
        }

        out.flush();
        out.close();
        input_File.close();

    } catch (IOException e) {

        Log.e("Download Error : ", "Failed");

    }
    Log.e("Download status", " Complete ");

    return null;
}

@Override
protected void onPostExecute(String s) {
    Toast.makeText(activity, "Song " + "'" + songName + "'" + " downloaded successfully", Toast.LENGTH_LONG).show();
    //pDialog.dismiss();

    if (download) {
        Toast.makeText(activity, "Could Not Connect to Server.", Toast.LENGTH_LONG).show();
        mNotificationHelper.clearNotification();
    } else
        mNotificationHelper.completed();
}

@Override
protected void onProgressUpdate(Integer... progress) {
    //pDialog.setProgress(progress[0]);

    mNotificationHelper.progressUpdate(progress[0]);

    super.onProgressUpdate(progress);
}
}

2 个答案:

答案 0 :(得分:2)

大部分时间都花在循环中

while ((count = input_File.read(data)) != -1) {

     total += count;
     publishProgress((int) (total * 100 / fileLength));

     out.write(data, 0, count);
}

您可以添加检查以查看任务是否已取消,

while ((count = input_File.read(data)) != -1 && !isCancelled()) {

     total += count;
     publishProgress((int) (total * 100 / fileLength));

     out.write(data, 0, count);
}

并通过致电

取消下载
yourAsyncTask.cancel()

答案 1 :(得分:0)

你可以强行取消asynctask

检查此

在您的活动中声明您的asyncTask:

private YourAsyncTask mTask;

像这样实例化:

mTask = new YourAsyncTask().execute();

像这样杀死/取消它:

mTask.cancel(true);