2010-11-26 56 views
2

J'ai implémenté un simple pattern Observer dans une application de style "hello world". J'ai 2 boutons, qui appellent onStart() et onDestroy() sur un Service.Comment puis-je mettre à jour mon interface utilisateur à l'aide d'un observateur?

Dans le onStart(), j'inscris un observateur et j'obtiens mon observateur pour lancer une boucle for appelant observe.update() une fois par seconde pendant 10 secondes. Cela appelle à son tour une méthode update() dans mon service.

Je suis en train d'afficher certaines données fictives qui est renvoyée, mais je reçois l'erreur suivante:

11-26 23:21:12.829: ERROR/AndroidRuntime(676): FATAL EXCEPTION: Thread-8 
     java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
     at android.os.Handler.<init>(Handler.java:121) 
     at android.widget.Toast.<init>(Toast.java:68) 
     at android.widget.Toast.makeText(Toast.java:231) 
     at com.jameselsey.observerpattern.LocalService.observe(LocalService.java:27) 
     at obs.Stub$1.run(Stub.java:49) 
     at java.lang.Thread.run(Thread.java:1096) 

que je fais ce qui suit dans mon service:

public void observe(String message) 
    { 
     Context context = getApplicationContext(); 
     Log.d("TEST", "Inside observe() on service, value is " + message); 

     Toast toast = Toast.makeText(context, message, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 

Après un peu de recherche, il semble que je ne puisse pas créer un message Toast car cette méthode ne fonctionne pas sur le thread principal de l'interface utilisateur.

Y at-il de toute façon je peux cracher message sur mon interface utilisateur? Je cherche juste à l'afficher sur l'activité, même un textView normal est OK.

+0

N'appelez pas onStart() et onDestroy() directement. C'est incroyablement mauvais. – Falmarri

+0

Salut Falmarri, J'ai 2 boutons qui sont mappés sur des méthodes dans une activité, ces activités appellent onStart/onDestroy. Est-ce encore mal? Quel est le meilleur? .. – Jimmy

Répondre

2

Les services ne sont censés afficher aucune interface utilisateur. La seule approche acceptable consiste à afficher un notification qui peut démarrer une activité via une intention. Votre service peut également communiquer avec votre interface utilisateur en utilisant un BroadcastReceiver ou il peut démarrer une activité directement.

Si votre activité est appelée d'une manière ou d'une autre par un thread d'arrière-plan, vous pouvez l'exécuter sur le thread principal en utilisant runOnUiThread. Vous devriez également vous familiariser avec services en général.