2011-10-29 7 views
5

Sto tentando di aggiornare l'interfaccia utente in FirstActivity quando ricevo una notifica ma sono confuso da runOnUiThread, Runnable e Handler. Ecco cosa ho: sto eseguendo FirstActivity e NotificationService. Quando NotificationService riceve una notifica, aggiornerà l'interfaccia utente di FirstActivity.Aggiornamento dell'interfaccia utente da un servizio (utilizzando un gestore?)

Ho anche un altro servizio AlarmService in esecuzione. prima azione

@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 
} 

continuo a ricevere l'errore looper.prepare. Devo inserire codici extra nella mia FirstActivity?

+0

puoi mostrarci i messaggi nel tuo log da logcat? Inoltre, come hai dichiarato Looper? –

+1

Ricevo "Impossibile creare il gestore all'interno del thread che non ha chiamato errore Looper.prepare()". Looper è dichiarato nel metodo 'showNotification' sopra – newbie

risposta

5

Il mio primo istinto è che si dovrebbe invece legare l'attività al servizio e gestire l'aggiornamento dell'interfaccia utente al suo posto anziché il servizio che modifica direttamente l'attività.

Vedi maggiori informazioni qui:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

E un esempio qui:
Example: Communication between Activity and Service using Messaging

+1

ottenuto la mia risposta da una delle risposte lì. Grazie! – newbie

0

Non ho idea del motivo per cui si sta mettendo un Looper in

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

    } 
}); 

perché l'interfaccia utente (main) thread ha già un Looper/Handler ecc.

Anche se funzionasse, Looper.loop() bloccherà e dal momento che lo stai eseguendo sul thread dell'interfaccia utente, bloccherà il thread dell'interfaccia utente che non è quello che desideri.

Che cosa si vuole veramente fare è

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 
    } 
}); 

non si ha realmente bisogno di fare tutta questa roba di fantasia per ottenere l'attività

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

assumendo il servizio e attività sono entrambi in esecuzione in nello stesso processo puoi semplicemente salvare un riferimento all'Attività, ma fai attenzione ad aggiornare il riferimento quando l'attività viene distrutta.

+0

Sia il servizio che l'attività sono in esecuzione nello stesso processo. Cosa intendi con il salvataggio di un riferimento all'attività? Ho provato a usare 'FirstActivity.runOnUiThread'. – newbie

+0

ha aggiornato anche la mia domanda – newbie

5

Ho sempre avuto il servizio di spegnere una trasmissione e quindi nella mia attività ho un BroadcastReciever in ascolto per la trasmissione. È un approccio molto più semplice di quello che hai descritto sopra.

Problemi correlati