¿Hay alguna forma de que Android sepa si el subproceso que ejecuta mi código es el subproceso UI o no? En swing hubo SwingUtilities.isEventDispatchThread()
para decirme si estoy en el hilo UI, o no. ¿Hay alguna función en el SDK de Android que me permita saber esto?Cómo saber si este hilo es un subproceso de interfaz de usuario
Respuesta
respuesta tomado de aquí: How to check if current thread is not main thread
Looper.myLooper() == Looper.getMainLooper()
cualquier aplicación de Android tiene sólo un hilo de interfaz de usuario, por lo que podría en algún lugar de la devolución de llamada actividad como onCreate() comprobar y almacenar su ID y más tarde simplemente compare el ID de ese hilo con el almacenado.
mMainThreadId = Thread.currentThread().getId();
De todos modos, se puede omitir la comprobación si quieres hacer algo en el hilo de interfaz de usuario y tener cualquier referencia a la actividad mediante el uso de
mActivity.runOnUiThread(new Runnable() { @Override public void run() { ... } });
que está garantizado para funcionar en hilo actual, si es UI, o puesto en cola en el hilo UI.
Hum en realidad debido a la arquitectura de Android, todas las actividades se ejecutan en el hilo principal, es decir, el hilo de la interfaz de usuario. Entonces cuando estás codificando una actividad, todo lo que está en tu Actividad está en el hilo de UI.
Es por eso que en Honeycomb se ha agregado un error al hacer llamadas de red en el hilo principal: bloquea totalmente la IU.
Por lo tanto, de hecho, siempre está trabajando en el hilo de la interfaz de usuario. Otra cosa: a menos que explícitamente solicite que esté en otro hilo, un Servicio operará en el mismo hilo que las actividades de su aplicación.
Entonces, ¿qué hacer?
- Cuando tiene que hacer cálculos pesados en su actividad; Una solución es usar AsyncTask (una clase diseñada para permitirle usar fácilmente otro hilo). El código en onExecute() se ejecuta en otro hilo (pero tenga cuidado con postExecute ejecuta en su hilo principal). Otro es iniciar manualmente un nuevo hilo cuando AsyncTask no está realmente adaptado.
- Si crea un servicio que hace tareas de fondo costosas, hágalo ejecutar en otro hilo con el atributo android: process = ": my_process" del manifiesto. Tendrá que crear un AIDL para comunicarse con este servicio separado, pero no es una tarea complicada.
- Muchos objetos, como por ejemplo MediaPlayer, tienen variaciones Async de sus métodos. Intenta siempre usarlos.
Ponga un punto de interrupción donde quiera verificar y, cuando reciba un golpe, verifique si puede interactuar con su UI (es decir, si la IU no está congelada). Si no puede interactuar con la interfaz de usuario, entonces se encuentra en el subproceso UI, de lo contrario, se encuentra en un hilo de fondo.
Sí, hay una manera. Comprueba el objeto de la hebra actual contra el objeto de hebra del lopper principal. Looper principal siempre está en el hilo de UI.
boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread();
- 1. ¿Cómo detectar si estamos en un hilo de interfaz de usuario?
- 2. ¿Es seguro este subproceso?
- 3. ¿Cuál es la definición de un subproceso de interfaz de usuario? ¿Hay solo un subproceso de interfaz de usuario en una aplicación .NET?
- 4. ¿Cómo saber si un programa se bloqueó con un subproceso?
- 5. ¿Es seguro utilizar este hilo de Parallel.ForEach()?
- 6. Cómo invocar un método en el subproceso de interfaz de usuario desde dentro de un subproceso de trabajo?
- 7. Android: ¿puede AsyncTask regresar en otro subproceso que el subproceso de interfaz de usuario?
- 8. Imprimir el contenido de un DocumentViewer en un subproceso de interfaz de usuario diferente
- 9. Cómo saber si un hilo es el hilo principal en C#
- 10. ¿Cómo puede un hilo de fondo colgar el hilo de la interfaz de usuario?
- 11. Android tarea asincrónica ralentizando mi interfaz de usuario Subproceso
- 12. ¿System.Windows.Forms.Timer se ejecuta en un subproceso diferente al de la interfaz de usuario?
- 13. ¿Cuál es la relación entre el hilo de JavaScript y el hilo de la interfaz de usuario de Silverlight?
- 14. Acceso a la interfaz de usuario en un hilo
- 15. ¿Es seguro iniciar y actividad de un hilo que no es de la interfaz de usuario?
- 16. ¿El hilo principal es igual que el hilo de la interfaz de usuario?
- 17. ¿Cómo puedo saber si un proceso tiene una interfaz gráfica?
- 18. Android: ¿forma correcta de pasar un mensaje desde el hilo de fondo al hilo de la interfaz de usuario?
- 19. ¿Es seguro este hilo html helper?
- 20. ¿El método loadUrl de WebView se ejecuta en el subproceso de interfaz de usuario?
- 21. Cómo saber si un usuario está visitando "/Default.aspx" o simplemente "/"
- 22. C#: Mostrar cuadro de diálogo en el hilo de la interfaz de usuario de otro hilo
- 23. ¿Cómo puedo verificar si este usuario es anónimo o realmente un usuario en mi sistema?
- 24. ¿Cómo saber si un manejador de archivo es un socket?
- 25. Cómo bloquear la interfaz de usuario de Winforms mientras se ejecuta el hilo de fondo
- 26. ¿Cómo puedo determinar si un hilo de Win32 ha finalizado?
- 27. ¿Cómo saber qué hilo está bloqueando un archivo en Java?
- 28. ¿La inserción de ContentProvider() siempre se ejecuta en el subproceso de interfaz de usuario?
- 29. Subproceso de llamada.Abordear un subproceso de un ThreadPool
- 30. ¿Cómo puedo saber con seguridad si un subproceso de impulso ha salido de su método de ejecución?
¿Por qué necesita saber en qué hilo se ejecuta su código?Si está destinado para el hilo de UI, simplemente envíelo allí. –
generalmente sabe cuándo se está ejecutando un método en el hilo de la interfaz de usuario. ¿Hay algún caso en particular en el que tengas una duda? – njzk2
Ningún caso en particular. Solo una forma de asegurar mi código multihilo. – user1730789