52 votes

CalledFromWrongThreadException : Seul le thread d'origine qui a créé une hiérarchie de vues peut toucher les vues.

J'ai un problème avec l'erreur suivante dans Android :

CalledFromWrongThreadException; : Seulement le thread original qui a créé une hiérarchie de vues peut toucher ses vues

Il semble que cela se produise lorsque j'essaie de mettre à jour un TextView dans mon activité, l'appel pour mettre à jour le TextView se fait à partir de mon activité mais je reçois toujours l'erreur ci-dessus.

Je l'ai comme ça :

onCreate() -met en place les boutons et la vue du texte.

onStateChange() - un écouteur pour les notifications sur les changements d'état, lorsqu'il reçoit une notification si le TextView est modifié pour afficher un texte différent.

Lorsque je reçois la notification d'un nouveau texte, j'essaie de modifier le TextView comme suit :

((TextView)findViewById(R.id.title)).setText("Some Text");

Mais je reçois l'erreur ci-dessus.

En cherchant sur Google, il semble que je doive utiliser un gestionnaire pour modifier le TextView ou peut-être utiliser AsyncTask ?

Quelqu'un peut-il expliquer lequel des deux serait le mieux à utiliser et pourquoi ?

EDIT : AJOUT DE BOUTS DE CODE :


     public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);  

            setContentView(R.layout.my);

            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.my_title);  

            ((TextView)findViewById(R.id.time)).setText("Hello Text");

            findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                    Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"));
                    startActivity(dialIntent);

                        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.FLAG_SOFT_KEYBOARD));
                        dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK));       
                }
        });

     }

//CallBacks from running Service

private final ICallDialogActivity.Stub iCallDialogActivity = new ICallDialogActivity.Stub(){

@Override
public void onStateChanged(int callState)
                throws RemoteException {    
            switch(callState){
            case GlobalData.CALL_STATUS_IDLE:

                break;

            case GlobalData.CALL_STATUS_DISCONNECTING:
                byeSetup();
                break;
    } 

};

public void byeSetup(){

            ((TextView)findViewById(R.id.time)).setText("Bye Text");

            findViewById(R.id.keyboardimage).setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    //Void the Button
                }});
}

1 votes

Vous êtes dans une sous-classe ? onStateChange est surchargé où ?

0 votes

Bonjour Pentium10, il est surchargé via une interface AIDL et communique avec un service, le service sera notifié d'un changement et dira ensuite à l'activité de mettre à jour son TextView en fonction de cela. J'ai ajouté des extraits de code pour mieux démontrer ce que j'essaie de faire. L'erreur semble apparaître de façon très aléatoire et apparaît aussi bien lorsque l'activité est au premier plan que lorsqu'elle ne l'est pas.

1 votes

Duplicata possible de CalledFromWrongThreadException

0voto

Nero Points 21

Vous pouvez utiliser la méthode post intégrée à la vue pour mettre à jour le contenu d'un autre fil, comme j'utilise la méthode edit text en Kotlin.

address_box.post { address_box.text="my text"}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X