簡體   English   中英

異步任務未取消

[英]Async Task not getting canceled

我正在嘗試使用AsyncTask下載文件,並且還想實現進度對話框中的“取消”按鈕以取消下載。

我認為問題出在“ doInBackground”方法中。 這是我的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”方法:

@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;
}

在此處輸入圖片說明

嘗試這個:

 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();
}

現在在您的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;
            }
        }

這是對我自己的帖子的回復(將來可能有人需要它):

實際上,我的asynctask會被取消,但我不知道,因為我認為當我們取消asynctask時,該文件不應存在。 但是實際上,當我們取消異步任務時,文件將被存儲,但是文件的大小較小。

例如。 假設文件為1mb,並且我已取消asynctask,而進度對話框顯示50%,則僅存儲500kb的文件,我認為這是實際文件。 對不起,我錯了。 因此,邏輯是當有人按“取消”時,您也需要刪除一半的下載文件。 對不起我的英語,我知道這太糟糕了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM