2011-10-29 25 views
5

Próbuję zaktualizować mój interfejs w FirstActivity po otrzymaniu powiadomienia, ale jest on mylony z runOnUiThread, Runnable i Handler. Oto, co mam: Używam usługi FirstActivity i NotificationService. Gdy usługa powiadomień ponownie otrzyma powiadomienie, zaktualizuje interfejs użytkownika FirstActivity.Aktualizacja interfejsu użytkownika z usługi (przy użyciu procedury obsługi?)

Mam również inną usługę AlarmService. Pierwszy aktywny

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

Wciąż dostaję looper.prepare błąd. Czy muszę umieszczać dodatkowe kody w moim FirstActivity?

+0

czy możesz pokazać nam wiadomości w dzienniku z logcat? Ponadto, jak zadeklarowałeś Looper? –

+1

Otrzymuję komunikat "Nie można utworzyć programu obsługi wewnątrz wątku, który nie wywołał błędu Looper.prepare()". Looper jest zadeklarowany w metodzie 'showNotification' powyżej – newbie

Odpowiedz

5

Mój pierwszy instynkt polega na tym, że powinieneś raczej powiązać działanie z twoją usługą i obsłużyć aktualizację interfejsu na swojej stronie zamiast usługi bezpośrednio modyfikującej działanie.

Zobacz więcej informacji tutaj:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

i przykład tutaj:
Example: Communication between Activity and Service using Messaging

+1

otrzymałem odpowiedź z jednej z odpowiedzi tam. dzięki! – newbie

0

nie mam pojęcia, dlaczego oddanie looper'a w

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

    } 
}); 

ponieważ UI (główny) wątek ma już Looper/Handler itp.

Nawet gdyby zadziałało, blokuje się Looper.loop(), a ponieważ używasz go w wątku UI, zablokuje on wątek interfejsu użytkownika, który nie jest tym, czego potrzebujesz.

Co naprawdę chcesz zrobić, to

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

Tak naprawdę nie trzeba robić to wszystko wymyślnych rzeczy, aby uzyskać aktywny

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

zakładając Służba i aktywność są uruchomione w w tym samym procesie można po prostu zapisać odwołanie do działania, ale należy zachować ostrożność podczas aktualizacji odwołania, gdy działanie zostanie zniszczone.

+0

Zarówno usługa, jak i aktywność działają w tym samym procesie. Co masz na myśli zapisując odniesienie do działalności? Próbowałem użyć 'FirstActivity.runOnUiThread'. – newbie

+0

również zaktualizowałem moje pytanie – newbie

5

Zawsze miałem wyłączenie usługi z transmisji, a następnie w mojej działalności mam BroadcastRĘŚCIE słuchając audycji. Jest to podejście znacznie prostsze niż to, które opisałeś powyżej.

Powiązane problemy