web-dev-qa-db-fra.com

Comment accéder à la vue de l'activité originale du service de fond engendré

J'ai une activité appelée A, et sur la sélection de l'élément de menu 0, elle reproche au service B, qui commence un C alinéable dans un nouveau fil. J'ai une vision textuelle dans l'activité A, que je veux accéder dans le fil C.

J'ai essayé de faire le TextView un domaine statique public, mais qui 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 également envisagé d'essayer de passer la vue à travers une intention, mais je ne sais pas comment cela fonctionnerait. Que dois-je avoir besoin de faire ce travail?

29
montooner

Vous devez mettre à jour les widgets du fil de l'interface graphique, alias "le fil qui a créé la hiérarchie de vue". Le moyen standard de le faire est via Handler S et un exemple d'utilisation des gestionnaires peuvent être trouvés dans l'exemple ProgressDialog Exemple (Développer 'Exemple Exam ProgressDialog avec un deuxième fil ').

21
Josef Pfleger

J'avais un problème similaire dans lequel une liste de réception devait être mise à jour sur la réponse du service Web provenant d'un fil séparé.

Après avoir analysé une question similaire & exemple , voici une solution qui devrait fonctionner pour vous:

public class A extends Activity implements Callback {

     callserviceB () { } // where your service B being called;

     @Override
     public void returnServiceResponse() {
          workOnResponse();
          handler.sendEmptyMessage(0);
     }

     private Handler handler = new Handler() {
          public void  handleMessage(Message msg) {
               //update your view from here only.
          }
     }
}

public class B implements Runnable {
     Callback callback;

     public void run() {
         //your business logic.
         callback.returnServiceResponse();
     }
}

public interface Callback {
     public void returnServiceResponse();
}
25
Sagar

L'autre moyen est d'utiliser Os.android.Asynccccccc.con pour le traitement.

1
yanchenko