如何停止我的AsyncTask进一步下载?

时间:2018-11-05 04:18:21

标签: android android-asynctask

我正在使用AsyncTask下载文件。它还显示了一个进度对话框,并带有一个“取消”按钮,当我单击“取消”时,它应该阻止AsyncTask进一步下载,但它什么也没做。

取消按钮代码:

 new DownloadFileAsync().cancel(true);

异步任务:

 class DownloadFileAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... aurl) {
        if (!isCancelled()) {
            File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
            File FileDirectory = new File(dir, guessed_file_name);
            int count;
            try {
                URL url = new URL(aurl[0]);
                URLConnection conexion = url.openConnection();
                conexion.connect();
                int lenghtOfFile = conexion.getContentLength();
                Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);
                InputStream input = new BufferedInputStream(url.openStream());
                OutputStream output = new FileOutputStream(FileDirectory);
                byte data[] = new byte[1024];
                long total = 0;
                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress("" + (int) ((total * 100) / lenghtOfFile));
                    output.write(data, 0, count);
                }
                output.flush();
                output.close();
                input.close();
            } catch (Exception e) {
            }
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("ANDRO_ASYNC", progress[0]);
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        Toast.makeText(getBaseContext(), "download completed!", Toast.LENGTH_LONG).show();
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
        finish();
    }
}

}

4 个答案:

答案 0 :(得分:1)

您不能这样做。您需要参考您的asynctask。 1.首先需要创建对象

DownloadFileAsync downloadTask = new DownloadFileAsync();

2。执行

dowloadTask.execute();

3。在该对象引用上,您可以调用.cancel(true)

downloadTask.cancel(true);

答案 1 :(得分:0)

您只需检查一次isCanceled。您也需要经常在函数中执行此操作,否则它实际上不会停止。一个好地方在您的while循环中,将其更改为while ((count = input.read(data)) != -1 && !isCancelled())

答案 2 :(得分:0)

似乎您仅在下载开始之前检查isCancelled()一次。添加如下所示的进度检查

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

}

答案 3 :(得分:0)

为此,您需要创建一个对象,然后将该对象用于执行以及取消任务。

因此,要按照您的代码启动AsyncTask,您必须做

new DownloadFileAsync().execute(<your inputs>);

您需要执行的操作,声明一个类级别的全局变量并将其用于开始执行

DownloadFileAsync mDownloadFileAsync = null; //declare as class global 

mDownloadFileAsync = new DownloadFileAsync();

mDownloadFileAsync.execute(<your inputs>);

要取消使用此DownloadFileAsync实例

if (mDownloadFileAsync != null && mDownloadFileAsync.getStatus == AsyncTask.Status.Running){

    mDownloadFileAsync.cancel(true);

}

并按照@Gabe Sechan和@Miraz Mahmud的建议修改AsyncTask中的while循环条件

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