2017-02-12 5 views
0

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

Я думаю, что проблема в методе 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; 
} 

enter image description here

ответ

1

попробовать это:

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; 
      } 
     } 
+0

На самом деле моя асинтеза получаю отменить, см. Мой ответ на мое сообщение. Во всяком случае, tanx для ответа – wangz

+0

это имеет смысл .. загрузка прекращается – rafsanahmad007

0

Это ответ на мой собственный пост (может быть в будущем кто-то это нужно):

Actualy мой AsyncTask получить отменить, но я не знаю, потому что я думал, что, когда мы отменяем AsyncTask файл должен не быть там. Но актуально, когда мы отменяем асинхронную задачу, файл хранится, но с меньшим размером.

например. Предположим, что файл равен 1mb, и я отменил asynctask, в то время как диалог выполнения показывает 50%, тогда сохраняется только файл 500kb, и я думал, что это фактический файл. Извините за мою ошибку. Итак, логика заключается в том, что когда кто-то нажимает «отменить», вам необходимо также удалить половину загруженного файла. и извините за мой английский, это ужасно, я знаю.