Comment accéder origine de l'activité de vues à partir engendré service d'arrière-plan
J'ai une activité appelée, et sur la sélection de l'élément de menu 0, il génère le service B, qui commence un exécutable C dans un nouveau thread. J'ai un TextView en activité, ce qui je veux accéder au thread C.
J'ai essayé de faire le TextView un public de champ statique, mais que génère l'erreur suivante:
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewRoot.checkThread(ViewRoot.java:2440)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewRoot.invalidateChild(ViewRoot.java:522)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:540)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2332)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.view.View.invalidate(View.java:4437)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView.updateAfterEdit(TextView.java:4593)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView.handleTextChanged(TextView.java:5932)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:6081)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.sendTextChange(SpannableStringBuilder.java:889)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:352)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.change(SpannableStringBuilder.java:269)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:432)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:259)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.text.SpannableStringBuilder.append(SpannableStringBuilder.java:28)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView.append(TextView.java:2191)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at android.widget.TextView.append(TextView.java:2178)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at com.android.peekaboo.DoScan$scanBody.run(DoScan.java:36)
07-21 07:26:25.723: ERROR/AndroidRuntime(1975): at java.lang.Thread.run(Thread.java:1058)
J'ai aussi envie de passer de la Vue à travers une intention, mais ne savez pas comment cela pourrait fonctionner. Que dois-je faire ce travail?
Vous devez vous connecter pour publier un commentaire.
Vous devez mettre à jour les widgets de l'interface graphique thread, alias "le thread qui a créé le point de vue de la hiérarchie'. Le standard de la façon de le faire est par l'intermédiaire de
Gestionnaire
s et un exemple de comment utiliser les gestionnaires peuvent être trouvés dans la ProgressDialog Exemple (extension de l'Exemple de ProgressDialog avec un deuxième thread").J'ai eu un problème similaire où une ListView devait être mis à jour sur le service web de la réponse à venir à partir d'un thread séparé.
Après l'analyse d'une question similaire & exemple, voici une solution qui devrait fonctionner pour vous:
Vous vraiment ne voulez pas être en manipulant directement les widgets à partir d'un service.
Par exemple, supposons que l'utilisateur glisse le clavier de son G1. Votre activité est détruit et recréé. Votre service, cependant, est maintenant sur les widgets à partir d'un défunt activité. Au mieux, les mises à jour ne se produira pas. Au pire, les mises à jour de causer une panne ou votre application aura une fuite de mémoire, parce que l'activité ne peut pas être récupérées, parce que votre service détient toujours sur elle.
Avoir des services de notifier des activités est OK, tant que vous avez décent isolement entre eux et l'activité se détache du service lorsqu'il est détruit.
L'autre façon est d'utiliser os.android.AsyncTask pour le traitement.