我正在尝试使用Movie
对象播放gif,它要求我调用invalidate()
方法。但是每当我调用此方法时,我都会收到以下错误:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
我如何解决这个问题以及为什么会发生这种情况
答案 0 :(得分:5)
在UI线程上运行指定的操作。
我建议您阅读此网站runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
//call the invalidate()
}
});
答案 1 :(得分:2)
试试这个
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();
答案 2 :(得分:1)
在Android中,只有主线程(也称为UI线程)可以更新视图。这是因为在Android中UI工具包不是线程安全的。
当您尝试从工作线程更新UI时,Android会抛出此异常。
确保从主线程更新UI。
答案 3 :(得分:1)
万一你需要在Kotlin:
val handler = Handler(Looper.getMainLooper())
handler.post({
invalidate()
})
答案 4 :(得分:0)
Android SDK中实际上有一种方法,您可以使用它在UI线程上运行invalidate(),而不必手动使自己的可运行程序或处理程序运行,请参阅官方文档here。
public void postInvalidate ()
导致无效事件在事件循环的后续周期中发生。使用它可以使来自非UI线程的视图无效。
仅当此视图附加到窗口时,才能从UI线程外部调用此方法。