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方法在将活动传递给一个或两个类后,可能会出现重复,谢谢。