2017-07-31 107 views
0

我試圖使用Movie對象來玩gif,它需要我調用invalidate()方法。然而,每當我把這個方法我收到以下錯誤:Android:只有創建視圖層次結構的原始線程可以在調用invalidate時觸及其視圖()

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

我該如何解決這個問題?它爲什麼發生

+0

發佈您的代碼片段 – Anil

+0

運行在UI線程的代碼片段,這是造成問題.use runOnUiThread方法 –

+1

[Android的可能重複「只有創建視圖層次結構的原始線程才能觸及其視圖。」](https://stackoverflow.com/questions/5161951/android-only-the-original-thread-該創建-A - 視圖 - hierar chy-can-touch-its-vi) –

回答

2

運行在UI線程上指定的動作。

我想推薦閱讀本網站runOnUiThread

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

//call the invalidate() 

    } 
}); 
+0

通過一個或兩個類的活動傳遞後,這工作,謝謝。 – Ryan

1

在Android中,只有主線程(也稱爲UI線程)可更新視圖。這是因爲在Android中,UI工具包不是線程安全的。

當您嘗試從工作線程更新UI時,Android會引發此異常。

確保從主線程更新UI。

1

試試這個

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(); 
0

的情況下你需要它在科特林:

val handler = Handler(Looper.getMainLooper()) 
    handler.post({ 
     invalidate() 
    }) 
相關問題