2017-07-31 5 views
0

J'essaie de jouer un gif en utilisant l'objet Movie et cela nécessite que j'appelle la méthode invalidate(). Cependant chaque fois que j'appelle cette méthode, je reçois l'erreur suivante:Android: seul le fil d'origine qui a créé une hiérarchie de vue peut toucher ses vues lors de l'appel de invalidate()

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Comment puis-je résoudre ce problème et pourquoi est-il ainsi

+0

publier votre extrait de code – Anil

+0

exécuter l'exemple de code dans thread d'interface utilisateur qui est à l'origine question Méthode .use runOnUiThread –

+1

Copie possible de [Android "Seul le thread d'origine qui a créé une hiérarchie de vue peut toucher ses vues."] (https://stackoverflow.com/questions/5161951/android-only-the-original-thread- that-created-a-view-hierar chy-can-touch-its-vi) –

Répondre

2

exécute l'action spécifiée sur le thread d'interface utilisateur.

Je voudrais recommander lire ce site runOnUiThread

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

//call the invalidate() 

    } 
}); 
+0

Après avoir passé l'activité à travers une ou deux classes cela a fonctionné, merci. – Ryan

1

Dans Android, seul le fil principal (également appelé le thread d'interface utilisateur) peut mettre à jour des vues . En effet, dans Android, la boîte à outils de l'interface utilisateur n'est pas thread-safe.

Lorsque vous essayez de mettre à jour l'interface utilisateur à partir d'un thread de travail Android lève cette exception.

Assurez-vous de mettre à jour l'interface utilisateur à partir du thread principal.

1

essayer cette

final Handler handler=new Handler(); 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      //your code 
      handler.post(new Runnable() { 
       @Override 
       public void run() { 
        invalidate() 
       } 
      }); 
     } 
    }).start(); 
0

dans le cas où vous avez besoin dans Kotlin:

val handler = Handler(Looper.getMainLooper()) 
    handler.post({ 
     invalidate() 
    })