简体   繁体   中英

Async Task not getting canceled

I am trying to download file using AsyncTask and also wanted to implement cancel button in progress dialog to cancel the download.

i think the problem is in "doInBackground" method. here is my asynctask:

public class Download_result extends AsyncTask<String,Integer,Void>{
ProgressDialog progressDialog;
Context context;
String pdfFile;


Download_result(Context context, String pdfFile){
this.context=context;
this.pdfFile=pdfFile;
}
@Override
protected void onPreExecute() {
    progressDialog = new ProgressDialog(context);
    progressDialog.setTitle("Downloading...");
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressDialog.setMax(200);
    progressDialog.setCancelable(false);
    progressDialog.setProgress(0);
    progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new   DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Download_result.this.cancel(true);  //cancel asynctask here
            dialog.dismiss();
        }
    });
    progressDialog.show();
}

@Override
protected Void doInBackground(String... params) {
  //given below
}
@Override
protected void onProgressUpdate(Integer... values) {
    progressDialog.setProgress(values[0]);       
}

@Override
protected void onPostExecute(Void result) {
    progressDialog.cancel();        

}
}

"doInBackground" method:

@Override
protected Void doInBackground(String... params) {      

        String url_1=params[0];
        int file_length=0;
        try {
            URL url = new URL(url_1);
            URLConnection urlConnection = url.openConnection();
            urlConnection.connect();
            file_length=urlConnection.getContentLength();
            filesize=file_length;
            File sdCard = Environment.getExternalStorageDirectory();
            File new_folder = new File (sdCard.getAbsolutePath() + "/xxx");

            File input_file = new File(new_folder,pdfFile);
            InputStream inputStream = new BufferedInputStream(url.openStream(),8192);
            byte[] data=new byte[1024];
            int total=0,count=0;
            OutputStream outputStream = new FileOutputStream(input_file);
            while ((count=inputStream.read(data))!=-1){
                total+=count;
                outputStream.write(data,0,count);

                int progress= (total*200)/file_length;
                downloadedsize=total;

                publishProgress(progress);
                if(isCancelled()){
                    break;  or return null; // same result
                }


            }
            inputStream.close();
            outputStream.close();


        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }          
    return null;
}

在此处输入图片说明

try this:

 boolean downloadstatus = true;

 @Override
protected void onPreExecute() {
        progressDialog = new ProgressDialog(context);
        progressDialog.setTitle("Downloading...");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(200);
        progressDialog.setCancelable(false);
        progressDialog.setProgress(0);
        progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
          download.cancel(true);
           downloadstatus=false;  //add boolean check
          dialog.dismiss();
        }
      });
        progressDialog.show();
}

Now in your doInbackGround()

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

            if(!your_AsyncTask.isCancelled() ||  downloadstatus !=false){
                total+=count;
                outputStream.write(data,0,count);
                int progress= (total*200)/file_length;
                downloadedsize=total;

                publishProgress(progress);
            }else{
                break;
            }
        }

This is a reply to my own post(may be in future someone need this):

Actualy my asynctask get cancel, but i didn't know because i thought that when we cancel the asynctask the file should not be there. But actualy when we cancel async task the file is stored but with the smaller size.

eg. Suppose the file is 1mb and i have cancel asynctask while progress dialog shows 50% then only 500kb file is stored, and i thought this is the actual file. sorry for my mistake. So the logic is when someone press cancel you need to delete the half downloaded file too. and sorry for my English, it's terrible i know.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM