Android método AsyncTask onPostExecute

EDIT: Si no uso el progreso en absoluto, sólo mostrando el diálogo, entonces todo funciona sin ningún problema. Pero si agrego el progreso, entonces el diálogo no cierra (el método onPostExecute () no es encendido).


El método onPostExecute no se ejecuta. ¿Dónde tengo un error? (El mismo resultado en el emulador y en el dispositivo) No estoy seguro si debo usar la anotación de Override para estos métodos

Esta es la solución áspera por ahora. Funciona cada vez, pero no es el adecuado y no el agradable. Lo que estoy haciendo: * Comienzo una actividad de niño usando tabgroupactividad * Entonces navego a otra actividad en la actividad de niño, así que es un niño actual de un padre * Hay una webview, donde exhibo información sobre un comentario. * Hay un enlace en el contenido mostrado por el webView * cuando hago clic en él, comienzo a descargar el archivo PDF.

Cuando se descarga el archivo:

while ((current = bis.read()) != -1) { read = read + current; baf.append((byte) current); Dialog.setProgress(read); if(Dialog.isShowing() && read+2*current>file_size){ Dialog.dismiss(); Dialog.cancel(); } } 

Mi objeto Dialog es disapeared, así que si intento llamar a Dialog después del bucle While, simplemente no lo entiendo. Así que lo que hice es que cada vez que recibo un nuevo búfer de sitio web, compruebo si el diálogo sigue siendo visible y si el byte actual junto con la cantidad de bytes leídos hasta ahora son mayores que el tamaño completo del archivo, entonces yo Cierre el cuadro de diálogo en el bucle while. Traté de usar fileSize == read (cantidad de bytes), pero no funcionó, tal vez no son precisamente mach uno al otro cuando el archivo se descarga

 private class DownloadPDFFile extends AsyncTask<String, Integer, Void> { private ProgressDialog Dialog = new ProgressDialog(getParent()); protected void onPreExecute() { Dialog.setMessage("Downloading PDF file.."); Dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); Dialog.setCancelable(false); // Dialog.setMax(1000); Dialog.setProgress(0); Dialog.show(); } protected Void doInBackground(String... urls) { File file=null; int file_size = 0; try { URL url = new URL(urls[0]); URLConnection urlConnection = url.openConnection(); urlConnection.connect(); file_size = urlConnection.getContentLength(); Dialog.setMax(file_size); } catch (IOException e) { } try { URL url1 = new URL(urls[0]); // you can // link file = new File("skm_intern_pdf.pdf"); URLConnection ucon = url1.openConnection(); InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(5000); int read = 0; int current = 0; while ((current = bis.read()) != -1) { read = read + current; baf.append((byte) current); Dialog.setProgress(read); if(Dialog.isShowing() && read+2*current>file_size){ Dialog.dismiss(); Dialog.cancel(); } } FileOutputStream fos = openFileOutput("skm_pdf.pdf", Context.MODE_WORLD_WRITEABLE); fos.write(baf.toByteArray()); fos.flush(); fos.close(); } catch (IOException e) { } return null; } 

¿Está el padre del AsyncTask cancelado / pausado / destruido antes de que termine el AsyncTask?

En caso afirmativo, el AsyncTask podría recibir una cancel() que resulta en onPostExecute() nunca se ejecute. Para verificar esto, intente reemplazar onCancelled() -method y compruebe si se ejecuta.

Es curioso cómo puedes publicar 3 veces la misma respuesta porque la gente no busca antes de publicar … No tienes permiso para acceder al subproceso de UI desde cualquier lugar excepto el subproceso de interfaz de usuario … Eso significa que tu Dialog.dismiss y Dialog.cancel No se puede ejecutar ya que no es seguro para Thread …

Para solucionar su problema tiene varias maneras. En primer lugar: NO utilice AsyncTask ya que tendrás 5 tareas (al máximo) ejecutándose cada vez … Te envío al Doc Android de AsyncTask , y las pautas a Procesos y Hilos adjunto para más información.

Segunda forma: Mueva todos los métodos UI Thread-related en el onPostExecute() . Esto es thread-safe, y el resultado de doInBackground() se transmite automáticamente a ella.

Tercera vía: uso de los siguientes

 Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) 

El Runnable se ejecutará dentro del subproceso UI. Así que otra vez. A salvo de amenazas.

Recomiendo la segunda solución si realmente no necesitas que tu aplicación esté completamente optimizada. Si lo hace, utilice tareas agregadas manualmente a un ThreadPoolExecutor creado manualmente (de nuevo, consulte el doc de ThreadPoolExecutor ).

Durante la búsqueda a través del documento que encontré esto:

Hay algunas reglas de subprocesamiento que se deben seguir para que esta clase funcione correctamente:

 The task instance must be created on the UI thread. execute(Params...) must be invoked on the UI thread. Do not call onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) manually. The task can be executed only once (an exception will be thrown if a second execution is attempted.) 

Si no está en UI Thread, no utilice AsyncTask pero Task en su lugar, con un ThreadPoolExecutor para envolverlos.

Esta es la razón por la que no debe utilizar Asynctask : ¿Cómo puedo hacer conexiones de URL asíncronas en Android? Busque mi nombre en las respuestas.

Encontré este hilo buscando el mismo problema. Después de mucho ensayo y error, encontré dos problemas:

  1. A veces cancelaba mi tarea en doInBackground en lugar de dejar que el método se completara normalmente, causando onCancelled () para disparar en lugar de onPostExecute (). Gracias por el consejo, Kasper!

  2. Aparentemente, estaba usando la firma de método incorrecto para onPostExecute. Si no tiene un tipo de devolución, debe ser:

    Protected void onPostExecute (Void v)

No muy intuitivo, y no se muestra en la API, pero una vez que hice esto que hizo el truco.

IMHO, sólo tienes que eliminar super llamada.

  • Cómo ejecutar la tarea asíncrona para un tiempo de espera establecido?
  • ¿Es posible separar la interfaz de usuario de WebView y los subprocesos HTTP?
  • ¿Por qué esta tarea de fondo falla con una excepción fatal?
  • Android Múltiples pausas de descarga reanudar en listview con actualización de progreso
  • Cómo pasar en dos tipos de datos diferentes a AsyncTask, Android
  • ¿Cuál es la diferencia entre largo y largo en código android?
  • Asíntase múltiple de una actividad
  • Obtención de resultados de varias AsyncTasks
  • Diálogo de progreso personalizado con la rotación de imagen Squre con AsynTask
  • Cómo utilizar AsyncTask en Servicios en Android?
  • Cómo rellenar un ListView con AsyncTask
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.