Cómo matar / eliminar / eliminar / detener completamente un AsyncTask en Android

Hice una aplicación que descarga videos de nuestro servidor. La cuestión es:

Cuando cancelo la descarga llamo:

myAsyncTask.cancel(true) 

Noté que myAsyncTask no se detiene en la cancelación de llamada … mi ProgressDialog sigue subiendo y es como saltar de estado a estado que me muestra que cada vez que cancelo y vuelva a iniciar un AsyncTask haciendo clic en el botón de descarga, comienza un nuevo AsyncTask … Cada vez que haga clic en descargar .. luego cancelar, a continuación, vuelva a descargar un AsyncTask separado se inicia.

¿Por qué myAsynTask.cancle(true) no cancela mi tarea? No quiero más en el fondo. Solo quiero cerrarlo completamente si hago clic en Cancelar.

Cómo hacerlo ?

EDITAR:

Gracias a gtumca-MAC, y los otros que me ayudaron lo hicieron por:

 while (((count = input.read(data)) != -1) && (this.isCancelled()==false)) { total += count; publishProgress((int) (total * 100 / lenghtOfFile)); output.write(data, 0, count); } 

¡¡¡Gracias!!!

7 Solutions collect form web for “Cómo matar / eliminar / eliminar / detener completamente un AsyncTask en Android”

AsyncTask no cancela proceso en

 myAsynTask.cancel(true) 

Para eso tienes que pararlo manualmente.

Por ejemplo, estás descargando video en doInBackground(..) en while / for loop.

 protected Long doInBackground(URL... urls) { for (int i = 0; i < count; i++) { // you need to break your loop on particular condition here if(isCancelled()) break; } return totalSize; } 

Declare en tu clase

 DownloadFileAsync downloadFile = new DownloadFileAsync(); 

Luego en Crear

 DownloadFileAsync downloadFile = new DownloadFileAsync(); downloadFile.execute(url); 

En su fondo ()

 if (isCancelled()) break; @Override protected void onCancelled(){ } 

Y puede matar a su AsyncTask por

 downloadFile.cancel(true); 

Cuando inicia un hilo independiente (AyncTask) tiene que finalizar. Debe agregar manualmente una instrucción de cancelación a su código dentro de AsyncTask.

Se puede cancelar una tarea en cualquier momento invocando cancel (boolean). Invocar este método hará que las llamadas posteriores a isCancelled () devuelvan true. Después de invocar este método, onCancelled (Object), en lugar de onPostExecute (Object) será invocado después de doInBackground (Object []) devuelve. Para asegurar que una tarea se cancele lo más rápidamente posible, siempre debe comprobar periódicamente el valor devuelto de isCancelled () desde doInBackground (Object []), si es posible (dentro de un bucle por ejemplo).

Compruebe más en la documentación: http://developer.android.com/reference/android/os/AsyncTask.html

He estado investigando desde las últimas 2 semanas y no llego a saber que cómo matamos la operación de Async manualmente. Algunos desarrolladores utilizan BREAK; Mientras se registra el bucle. Pero en mi escenario no estoy usando el bucle dentro de hilo de fondo. Pero tengo que saber cómo woks su lógica estúpida, pero funciona perfectamente bien.

 downloadFile.cancel(true); //This code wont work in any case. 

En lugar de cancelar y hacer tanto trabajo en el hilo de fondo apague el wifi de forma programática

 WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifi.setWifiEnabled(false); 

¿Dónde quieres matar la operación y activarla donde necesitas eso.

 WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); wifi.setWifiEnabled(true); 

Lo que sucede es que tu bloque try salte a la IOException matando las tareas de fondo.

Es mejor utilizar la biblioteca asyncTask vogella que tienen un montón de características como la prioridad y la cancelación de la tarea de fondo. Y un gran tutorial o usarlo está aquí

Puede utilizar este código. Estoy descargando un archivo OTA como sigue:

 static class FirmwareDownload extends AsyncTask<String, String, String> { public String TAG = "Super LOG"; public String file; int lenghtOfFile; long total; @Override protected String doInBackground(String... f_url) { try { int count; Utilies.getInternet(); URL url = new URL(f_url[0]); URLConnection connection = url.openConnection(); connection.connect(); lenghtOfFile = connection.getContentLength(); mProgressBar.setMax(lenghtOfFile); InputStream input = new BufferedInputStream(url.openStream(), 8192); String fileName = f_url[0].substring(f_url[0].lastIndexOf("/"), f_url[0].length()); File root = Environment.getExternalStorageDirectory(); File dir = new File(root.getAbsolutePath() + fileName); Log.d(TAG, "trying to download in : " + dir); dir.getAbsolutePath(); OutputStream output = new FileOutputStream(dir); byte data[] = new byte[1024]; while ((count = input.read(data)) != -1) { if (isCancelled()) break; total += count; mProgressBar.setProgress(Integer.parseInt("" + total)); Log.d("Downloading " + fileName + " : ", " " + (int) ((total * 100) / lenghtOfFile)); mPercentage.post(new Runnable() { @Override public void run() { mPercentage.setText(total / (1024 * 1024) + " Mb / " + lenghtOfFile / (1024 * 1024) + " Mb"); } }); output.write(data, 0, count); } output.flush(); output.close(); input.close(); //new InstallHelper().commandLine("mkdir data/data/ota"); File fDest = new File("/data/data/ota/" + fileName); copyFile(dir, fDest); FirmwareInstaller fw = new FirmwareInstaller(); fw.updateFirmware(); } catch (Exception a) { System.out.println("Error trying donwloading firmware " + a); new InstallHelper().commandLine("rm -r data/data/ota"); dialog.dismiss(); } return null; } } 

Por lo tanto, si desea cancelar, sólo tiene que utilizar este código:

  fDownload.cancel(true); 

He utilizado con éxito dentro de una actividad con TextView onclick …

  //inside the doInBackground() ... try { while (true) { System.out.println(new Date()); //should be 1 * 1000 for second Thread.sleep(5 * 1000); if (isCancelled()) { return null; } } } catch (InterruptedException e) { } 

Y en mi onCreate () …

  //set Activity final SplashActivity sPlashScreen = this; //init my Async Task final RetrieveFeedTask syncDo = new RetrieveFeedTask(); syncDo.execute(); //init skip link skip_text = (TextView) findViewById(R.id.skip_text); skip_text.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //cancel Async syncDo.cancel(true); //goto/start another activity Intent intent = new Intent(); intent.setClass(sPlashScreen, MainActivity.class); startActivity(intent); finish(); } }); 

Y mi elemento xml TextView …

  <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/skip_text" android:layout_marginTop="20dp" android:text="SKIP" android:textColor="@color/colorAccent"/> 
  • Cómo pasar el resultado del método onpostexecute asynctask en la actividad principal android
  • Cambiar la orientación de la orientación con AsyncTask
  • Error de puntero nulo en la tarea asíncrona
  • Android: no se puede resolver el método 'findViewById (int)' en AsyncTask
  • Cómo utilizar AsyncTask
  • Android: las solicitudes HTTP en AsyncTask no son concurrentes
  • ¿Cómo puedo ejecutar esta clase en el hilo de interfaz de usuario?
  • ProgressDialog en AsyncTask lanza una excepción
  • Cómo realizar operaciones de base de datos mediante Async Task
  • De error de memoria durante el uso de viewpager + imageview incluso cuando se utiliza la memoria caché y asynctask
  • Enfoque eficiente para comprobar continuamente si la conexión a Internet está disponible en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.