【问题标题】:How do I stop my AsyncTask from downloading further?如何阻止我的 AsyncTask 进一步下载?
【发布时间】:2018-11-05 13:49:03
【问题描述】:

我正在使用 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();
    }
}

}

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    你不能这样做。您需要参考您的异步任务。 1.首先你需要创建对象

    DownloadFileAsync downloadTask = new DownloadFileAsync();
    

    2。执行它

    dowloadTask.execute();
    

    3。在这个对象引用上你可以调用 .cancel(true)

    downloadTask.cancel(true);
    

    【讨论】:

    • 我在哪里创建对象?在 oncreate 中?
    • 是的,当然!你可以在 oncreate();
    • 您可能必须在您的 DownloadFileAsync 类中创建默认构造函数。
    【解决方案2】:

    为此,您需要创建一个对象,然后使用该对象执行和取消任务。

    因此,要按照您的代码启动 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())
    

    【讨论】:

    • 它可以工作,但是当我再次尝试下载时它崩溃“无法执行任务:任务已经执行(任务只能执行一次)”
    • 每次需要执行时都需要初始化任务变量。
    【解决方案3】:

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

    【讨论】:

    • 我完全按照你说的做了,但是没有用。它仍在后台下载
    【解决方案4】:

    您似乎只在下载开始前检查了一次isCancelled()。添加如下检查进度

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

    【讨论】:

    • 您还创建了一个新的异步任务来取消!。请务必取消您之前创建的同一任务。 DownloadFileAsync downloadFileAsync = DownloadFileAsync();下载FileAsync.cancel(true);
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多