Android:只有创建视图层次结构的原始线程可以在调用invalidate()时触及其视图。

我正在尝试使用Movie对象来播放gif,它需要我调用invalidate()方法。 但是每当我调用这个方法,我得到以下错误:

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

我如何解决这个问题,为什么会发生这种情况

在UI线程上运行指定的操作。

我想推荐阅读这个网站runOnUiThread

 runOnUiThread(new Runnable() { @Override public void run() { //call the invalidate() } }); 

在Android中,只有主线程(也称为UI线程)才能更新视图。 这是因为在Android中,UI工具包不是线程安全的。

当您尝试从工作线程更新UI时,Android会引发此exception。

确保从主线程更新UI。

尝试这个

  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(); 

如果你在Kotlin需要它:

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