Android:调用invalidate()时,只有创建视图层次结构的原始线程才能接触其视图

Android:调用invalidate()时,只有创建视图层次结构的原始线程才能接触其视图,android,invalidation,Android,Invalidation,我试图使用电影对象播放gif,它要求我调用invalidate()方法。但是,无论何时调用此方法,都会出现以下错误: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 我该如何解决这个问题,以及为什么会发生这种情况在Android中,只有主线程(也称为UI线程)可以更新视图。这是

我试图使用
电影
对象播放gif,它要求我调用
invalidate()
方法。但是,无论何时调用此方法,都会出现以下错误:

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

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

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

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

确保从主线程更新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();

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

我想推荐你阅读这个网站

runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
//调用invalidate()命令
}
});

如果您在Kotlin需要它:

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

Android SDK中实际上有一个方法可以用来在UI线程上运行invalidate(),而无需手动创建自己的runnable或handler,请参阅官方文档

public void postInvalidate()

在事件循环的后续循环中导致失效。使用此选项可使非UI线程中的视图无效

只有当此视图附加到窗口时,才能从UI线程外部调用此方法


发布您的代码段在UI线程中运行导致问题的代码段。使用runOnUiThread方法在将活动传递给一个或两个类后,可能会出现重复,谢谢。