Как я могу остановить дальнейшую загрузку AsyncTask? - PullRequest
0 голосов
/ 05 ноября 2018

Я использую AsyncTask для загрузки файла. Он также отображает диалоговое окно хода выполнения и имеет кнопку отмены. Когда я нажимаю кнопку «Отмена», предполагается, что AsyncTask не сможет продолжить загрузку, но он ничего не делает.

код кнопки отмены:

 new DownloadFileAsync().cancel(true);

AsyncTask:

 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 голосов
/ 05 ноября 2018

Для этого вам нужно создать объект, а затем использовать его для выполнения и отмены задачи.

Так что для запуска 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);

}

А также измените условие цикла while внутри AsyncTask, как упомянуто @Gabe Sechan и @Miraz Mahmud

while ((count = input.read(data)) != -1 && !isCancelled())
0 голосов
/ 05 ноября 2018

Кажется, вы проверяете isCancelled() только один раз перед началом загрузки. добавить проверку прогресса, как показано ниже

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

}
0 голосов
/ 05 ноября 2018

Вы не можете сделать это так. Вам нужна ссылка на вашу асинктазу. 1. сначала нужно создать объект

DownloadFileAsync downloadTask = new DownloadFileAsync();

2. выполнить его

dowloadTask.execute();

3. для этой ссылки на объект вы можете вызвать .cancel (true)

downloadTask.cancel(true);
0 голосов
/ 05 ноября 2018

Вы проверяете isCanceled только один раз. Вам нужно делать это очень часто внутри функции, иначе она не остановится. Хорошее место в вашем цикле while, измените его на while ((count = input.read(data)) != -1 && !isCancelled())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...