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