sql >> Base de Datos >  >> RDS >> SQLite

IntentService está congelando la interfaz de usuario de mi aplicación

¿Está absolutamente seguro de que es el IntentService? ¿Esa es la causa raíz de la congelación de la interfaz de usuario? Los servicios de intención están especialmente diseñados para ejecutarse en subprocesos de trabajo con el fin de descargar el procesamiento del subproceso principal (UI), siendo una de las principales razones para ayudar a prevenir La interfaz de usuario se congela.

Quizás intente comenzar sus esfuerzos de depuración en el nivel de la interfaz de usuario. En particular, lo que proporciona el ResultReceiver al IntentService cuando lo inicias y qué haces en el onReceiveResult método de devolución de llamada en esa instancia de receptor?

Aparte de eso, para la actividad en la que está experimentando los bloqueos, verifique qué tipo de operaciones está realizando. Cargar grandes cantidades de datos desde una base de datos en el hilo principal (es decir, sin usar un Loader o algo similar para descargar el procesamiento a un subproceso de trabajo) es una causa común de bloqueos de la interfaz de usuario, al menos en mi experiencia hasta ahora.

Actualizar

Creo que he resuelto cuál es el problema. Hay dos problemas principales, ambos derivados de cómo estás usando Volley. Cuando agrega una solicitud a la cola de Volley, se ejecuta de forma asíncrona. Eso significa que la queue método regresa inmediatamente. En su código de servicio de intención, esto significa que el servicio pasa inmediatamente a decirle al ResultReceiver que ha terminado de procesar, cuando en realidad todo lo que ha hecho es poner en cola la solicitud. Los cinco servicios de intención harán esto, lo que significa que MainActivity entrará en muy rápidamente. Este es el primer número.

El segundo problema explica la congelación que está experimentando. Aunque Volley ejecuta solicitudes en subprocesos de trabajo, devuelve las respuestas analizadas a las solicitudes en el subproceso principal; consulte la documentación aquí. Esto significa que todo el procesamiento de respuestas que está realizando en el servicio de intención (colocar los datos en la base de datos, etc.) en realidad está ocurriendo en el subproceso principal (IU). Esto explica la congelación.

Lo que probablemente quieras hacer aquí es cambiar a usar RequestFuture de Volley. en cambio. Básicamente, esto convierte una solicitud asíncrona en una síncrona al permitirle bloquear hasta que finalice la solicitud. Para hacer esto, cree un futuro del tipo apropiado (JSONObject en su caso) y configúrelo como detector y detector de errores para la solicitud. Luego, ponga en cola la solicitud como lo hace ahora, e inmediatamente después llame al get método sobre el futuro. Este método se bloqueará hasta que la respuesta haya terminado de procesarse. Está bien hacer esto en un servicio de intenciones porque se ejecuta en un subproceso de trabajo, no en el subproceso de la interfaz de usuario.

Si la solicitud tiene éxito, obtendrá los datos devueltos y podrá ejecutar toda la lógica que se encuentra actualmente en su Response.Listener implementación. Si ocurre un error (es decir, la solicitud falla por algún motivo), la solicitud futura generará una excepción que puede manejar para tomar las medidas apropiadas.

El uso de futuros de solicitud es un enfoque bastante diferente al uso de oyentes y es posible que deba cambiar un poco su código para que funcione, pero debería resolver los problemas que está viendo.

Espero que ayude, y mis más sinceras disculpas por no detectar el error antes.