Puede NoticationManager.notify () ¿se llama desde un hilo de trabajo?
Mi pregunta es más acerca de lo que es una buena práctica que lo que es posible:
- ¿Es bueno llamar
NoticationManager.notify()
desde un hilo de trabajo? - ¿El sistema lo ejecuta en el subproceso de interfaz de usuario de todos modos o no?
Siempre trato de tener en cuenta que las cosas relacionadas con la interfaz de usuario deben ejecutarse en el subproceso de interfaz de usuario y el resto en los subprocesos de trabajo, como sugiere el documento de Android sobre Procesos y Subprocesos :
Además, el Andoid UI toolkit no es seguro para subprocesos. Por lo tanto, usted debe no manipular tu IU desde un hilo de trabajo-debes hacer todo manipulación de la interfaz de usuario desde el subproceso de interfaz de usuario. Por lo tanto, hay son simplemente dos reglas para el modelo de hilo único de Android:
- No bloquee el subproceso de interfaz de usuario
- No acceda al kit de herramientas de interfaz de usuario de Android desde fuera del subproceso de interfaz de usuario
SIN embargo, me sorprendió un ejemplo dado por el propio documento de Android ( acerca de mostrar el progreso en Notificaciones ), donde un progreso de notificación en curso se actualizó directamente desde un hilo de trabajo:
mNotifyManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("Picture Download")
.setContentText("Download in progress")
.setSmallIcon(R.drawable.ic_notification);
// Start a lengthy operation in a background thread
new Thread(
new Runnable() {
@Override
public void run() {
int incr;
// Do the "lengthy" operation 20 times
for (incr = 0; incr <= 100; incr+=5) {
// Sets the progress indicator to a max value, the
// current completion percentage, and "determinate"
// state
mBuilder.setProgress(100, incr, false);
// Displays the progress bar for the first time.
mNotifyManager.notify(0, mBuilder.build());
// Sleeps the thread, simulating an operation
// that takes time
try {
// Sleep for 5 seconds
Thread.sleep(5*1000);
} catch (InterruptedException e) {
Log.d(TAG, "sleep failure");
}
}
// When the loop is finished, updates the notification
mBuilder.setContentText("Download complete")
// Removes the progress bar
.setProgress(0,0,false);
mNotifyManager.notify(ID, mBuilder.build());
}
}
// Starts the thread by calling the run() method in its Runnable
).start();
Es por eso que me pregunto si es realmente necesario ejecutarlo en el hilo principal, o si el sistema se encarga de ello.
Gracias por su ayuda!
1 answers
Es aceptable actualizar un Notification
desde un hilo de trabajo porque el Notification
no vive en el proceso de su aplicación y, por lo tanto, no está actualizando su interfaz de usuario directamente. La Notificación se mantiene en un proceso del sistema, y la interfaz de usuario de Notification
se actualiza a través de RemoteViews
(doc ), que permite la manipulación de una jerarquía de vistas que es mantenida por un proceso distinto al suyo. Si nos fijamos en la fuente para Notification.Builder
aquí se puede ver que en última instancia se está construyendo un RemoteViews
.
Y si nos fijamos en la fuente para RemoteViews
aquí verá que cuando manipula una vista, realmente solo está creando un Action
(source) y añadirlo a una cola para ser procesado. Un Action
es un Parcelable
que finalmente se envía a través de IPC al proceso que posee la vista Notification
, donde puede desempaquetar los valores y actualizar la vista como se indica... en su propio hilo de interfaz de usuario.
Espero que esto aclare por qué está bien actualizar un Notification
desde un hilo de trabajo en su solicitud.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-04 06:09:29