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

时间:2017-07-31 11:37:43

标签: android invalidation

我正在尝试使用Movie对象播放gif,它要求我调用invalidate()方法。但是每当我调用此方法时,我都会收到以下错误:

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

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

5 个答案:

答案 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线程外部调用此方法。