2012-01-24 13 views
5

trabajando en mi AsyncTask Me pregunto por qué debería utilizar el onPostExecute()' parámetro s, cuando puedo utilizar una variable de instancia nivel de clase en mi clase AsyncTask para compartir datos entre doInBackground() y onPostExecute().AsyncTask.onPostExecute() 's vs parámetros variables instancia

Ambos funcionan, pero ¿hay algún pro y contra para cada enfoque?

Editar: cuando digo 'variable de instancia', estoy hablando de una variable de instancia privada en la clase extendida AsyncTask. Cuando la clase muere, la variable de instancia también muere.

+1

supongo que es útil en caso de que su AsyncTask esté escrita en un archivo de clase separado – waqaslam

+0

Este no es el punto, porque creo que Jop van Raaij significaba el nivel de clase de AsyncTask en sí mismo –

Respuesta

5

Bueno, puede reducir la probabilidad de pérdida de memoria, ya que no tiene una referencia a su objeto a nivel de clase, sino solo los métodos AsyncTask.

También eliminará los problemas de sincronización, como @nico_ekito mencionado

+1

Estoy de acuerdo con @ a.ch. Y también es mejor para la seguridad del hilo. –

+0

Creo que esta respuesta es válida. Sin embargo, solo el 'AsyncTask' tendrá una referencia a la variable de instancia. No veo una fuga de memoria fácil. Debido a que 'doInBackground()' y 'OnPostExecute()' se llaman sincrónicamente, no es muy probable que la JVM todavía esté trabajando en la variable de instancia cuando se llama a 'OnPostExcetute()' (si eso es posible). –

0

Así como las otras razones publicados; si obtiene una excepción en el doInBackground(), puede pasar un parámetro que represente un error a su onPostExecute() y cancelar cualquier trabajo adicional, en lugar de tener que obtener otra excepción cuando se da cuenta de que no se han creado las instancias adecuadas de todas sus variables.

+0

Supongo que deberías usar 'cancel (boolean)'. Esto también saltará 'onPostExecute()'. Cuando desee trabajar condicional del estado resultante de lo que hace en 'doInBackgroud()', debe proporcionar el estado en los parámetros (feo para usar el mismo parámetro para dos tipos de información), o establecer una variable de instancia como 'mSuccess' (esta solución la vi en algún tutorial). –

1

He encontrado que el uso de variables de instancia dentro de AsyncTask no es seguro para subprocesos. En mi caso, si atrapé y Exception en doInBackground(), lo configuraría en la variable de instancia Excepción de AsyncTask. Luego comprobaría si la variable era nula o no en onPostExecute() (no cancelo() porque es posible que desee mostrar un mensaje en la excepción para el usuario).

De todos modos, de vez en cuando registraba que había detectado una excepción en doInBackground, pero en onPostExecute la variable de instancia sería nula. La documentación dice que los métodos se llaman sincrónicamente, así que no puedo explicar POR QUÉ eso sucede, pero lo vi suceder varias veces.

Finalmente, cambié mi clase "Result" para contener tanto una excepción como el resultado original que quería pasar a onPostExecute. Eso funciona bien.

0

Permítanme disentir de la respuesta aceptada (y otras).

No hay absolutamente ningún problema de seguridad de subprocesos al usar campos de instancia en una AsyncTask para pasar valores de una devolución de llamada a otra. Por lo general, esto significaría pasar valores de doInBackground() a onPostExecute(). Se garantiza que las rellamadas en AsyncTask nunca se ejecutarán simultáneamente, por lo que no hay condiciones de carrera, tampoco hay forma de que un campo de instancia se pierda o sea nulo si se estableció en una devolución de llamada previamente ejecutada. Ahora a la respuesta.

Pros de onPostExecute() parámetro:

  • El parámetro viene del valor de retorno de doInBackground() que asegura que doInBackground() debe proporcionar un valor al volver, asegurando que nunca se olvida
  • El parámetro es una relación claramente establecida entre doInBackground() y devoluciones de llamada que siguen: onPostExecute() y onCancelled(), un campo de instancia podría servir para varios propósitos posibles

contras de onPostExecute() parámetro:

  • Es un solo parámetro, por lo tanto no se puede pasar dos o más valores, como solución alternativa se puede envolver varios valores en una clase de su creación o quizá Pair

Las ventajas y desventajas de usar un campo de instancia para pasar valores de doInBackground() a onPostExecute() son básicamente las inversas exactas de las anteriores.

Cuestiones relacionadas