2011-10-29 22 views
5

Estoy intentando actualizar mi IU en FirstActivity cuando recibo una notificación pero me confunden runOnUiThread, Runnable y Handler. Esto es lo que tengo: estoy ejecutando FirstActivity y NotificationService. Cuando NotificationService reenvía una notificación, actualizará la IU de FirstActivity.Actualización de la IU desde un servicio (¿con un controlador?)

También tengo otro servicio AlarmService ejecutándose. Primera Actividad

@Override 
public void onResume() { 
     super.onResume(); 
     //some other code for alarm service 
} 

NotificationService

//on receiving notification 
    private void showNotification(String text) { 

    //Get activity 
    Class<?> activityClass = null; 
    try { 
     activityClass = Class.forName("com.pakage.FirstActivity"); 
     contextActivity = (Activity) activityClass.newInstance(); 

     //Update UI on FirstActivity not working 
     contextActivity.runOnUiThread(new Runnable() { 
      public void run() 
      { 
       Looper.prepare(); 
       TextView tv = (TextView) contextActivity.findViewById(R.id.notifyTest); 
       Looper.loop(); 

      } 
      }); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

      //Shows the notification 
      Notification n = new Notification();  
      //... etc 
} 

sigo obteniendo el error looper.prepare. ¿Debo poner códigos adicionales en mi FirstActivity?

+0

¿Puede mostrarnos los mensajes en su registro de logcat? Además, ¿cómo declaraste a Looper? –

+1

Obtengo 'No se puede crear el controlador dentro de la hebra que no ha llamado al error Looper.prepare()'. Looper se declara en el método 'showNotification' sobre – newbie

Respuesta

5

Mi primer instinto es que en su lugar debe tener la actividad de enlazar a su servicio y manejar la actualización de la interfaz de usuario en su lado en lugar de que el servicio modifique directamente la actividad.

Ver más información aquí:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

Y un ejemplo aquí:
Example: Communication between Activity and Service using Messaging

+1

obtuvo mi respuesta de una de las respuestas allí. ¡Gracias! – newbie

0

no tengo ni idea de por qué usted está poniendo un looper en

contextActivity.runOnUiThread(new Runnable() { 
    public void run() 
    { 
     Looper.prepare(); 
     TextView tv = (TextView) contextActivity.findViewById(R.id.notifyTest); 
     Looper.loop(); 

    } 
}); 

debido a que la interfaz de usuario (main) thread ya tiene un Looper/Handler, etc.

Incluso si funciona Looper.loop() va a bloquear y, dado que lo está ejecutando en el subproceso de la interfaz de usuario, bloqueará el subproceso de interfaz de usuario que no es lo que desea.

Lo que realmente quiere hacer es

contextActivity.runOnUiThread(new Runnable() { 
    public void run() 
    { 
     TextView tv = (TextView) contextActivity.findViewById(R.id.notifyTest); 
     tv.setText("do something that must be on UI thread") // or whatever 
    } 
}); 

que realmente no tiene que hacer todo esto cosas de lujo para conseguir la Actividad

activityClass = Class.forName("com.pakage.FirstActivity"); 
contextActivity = (Activity) activityClass.newInstance(); 

suponiendo que el servicio y la actividad están ejecutando en tanto el mismo proceso puede guardar una referencia a la Actividad, pero tenga cuidado de actualizar la referencia cuando la Actividad se destruya.

+0

Tanto el servicio como la actividad se ejecutan en el mismo proceso. ¿Qué quiere decir con guardar una referencia a la actividad? Intenté usar 'FirstActivity.runOnUiThread'. – newbie

+0

actualizó mi pregunta también – newbie

5

Siempre acabo de hacer que el servicio se active en una Transmisión y luego en mi Actividad tengo un BroadcastReciever que escucha la Transmisión. Es un enfoque que es mucho más simple que el que describió anteriormente.

Cuestiones relacionadas