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