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!

Author: Joffrey, 2013-03-20

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.

 73
Author: Brett Duncavage,
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