threads thread stop priority new make isalive android multithreading thread-safety inflate

android - thread - Inflar una vista en un hilo de fondo



thread new android (3)

¿Es o no es posible inflar una vista (no agregarla al diseño) en un subproceso en segundo plano (por ejemplo, en el DoInBackground de una AsyncTask)?

Posible, sí. ¿Recomendado? No. Como se menciona en la documentación:

Por lo tanto, simplemente hay dos reglas para el modelo de un solo hilo de Android:

  1. No bloquee el hilo de la interfaz de usuario
  2. No acceda al juego de herramientas de interfaz de usuario de Android desde fuera del hilo de la interfaz de usuario

a través de: Procesos e hilos

Tengo una pregunta muy simple:

¿Es o no es posible inflar una vista (no agregarla al diseño) en un subproceso en segundo plano (por ejemplo, en el doInBackground de una AsyncTask )?

Sé que es posible, porque he implementado la mayoría de las actividades en mi aplicación de esta manera y nunca tuve un problema, hasta que tuve este problema en un Galaxy S: Android: android.view.InflateException: archivo XML binario línea # 13: error Inflar la clase <desconocido> en SAMSUNG Galaxy S

Me han dicho que no debo inflar las Views en subprocesos en segundo plano, pero ¿cuáles son las razones específicas y por qué mi enfoque funciona en la mayoría de los dispositivos pero no en Galaxy S?


Con la última versión de soporte, puede usar android.support.v4.view.AsyncLayoutInflater para inflar vistas de forma asíncrona. Sin embargo, tenga cuidado de que no se pueda inflar en el hilo de la interfaz de usuario si no se cumplen los requisitos específicos:

Para que un diseño se infle de forma asíncrona, debe tener un elemento primario cuyo generateLayoutParams (AttributeSet) sea seguro para subprocesos y todas las vistas que se construyan como parte de la inflación no deben crear ningún manejador ni llamar a myLooper (). Si el diseño que está intentando inflarse no se puede construir de forma asíncrona por cualquier motivo, AsyncLayoutInflater automáticamente volverá a inflarse en el subproceso de la interfaz de usuario.


El LayoutInflater no hace ninguna suposición sobre en qué hilo se ejecuta. Y nada se menciona sobre esto en su documentación. También su código parece ser thread-agnostic.

Por otro lado, las vistas creadas por LayoutInflater pueden crear una instancia de Handler s en sus constructores. Bueno, probablemente no deberían hacer eso, pero no hay ningún requisito para que no creen / utilicen Handler s en sus constructores.

Supongo que Samsung Galaxy S tuvo algunas modificaciones en su EditText que de alguna manera desencadena la creación de Handler (de acuerdo con el registro de bloqueo de su otra instancia de instancia de GestureDetector se GestureDetector una instancia que a su vez creó un nuevo Handler ). Si bien la implementación predeterminada no hace esto.

En general, diría que, dado que no existe un requisito explícito para que View s no use Handler y Looper en sus constructores, no se puede asumir que inflar Views desde un subproceso que no sea UI sea seguro.

En realidad, puede crear HandlerThread y tratar de inflar View s dentro de él. Pero diría que esto es muy arriesgado, como en el ejemplo de Samsung Galaxy S, la vista asume que este hilo estará vivo durante el tiempo de vida de la View y procesará todos los mensajes usando su Looper . Lo cual podría ocasionar un bloqueo posterior.