2010-11-04 52 views
0

我想每x秒設置一次ImageView的背景。 使用的Drawables從服務器下載,放置在Vector中,當它們都被下載時,我啓動一個Timer和一個TimerTask,它只需在一個Activity的Layout中設置一個ImageView。TimerTask和ImageView.setBackgroundDrawable一個不走?

問題是我得到一個: android.view.ViewRoot $ CalledFromWrongThreadException:只有創建視圖層次結構的原始線程可以觸及其視圖。

我在這裏猜測這是因爲TimerTask,即使它只是從原始的Activity調用一個方法,該方法依次從本地Vector設置ImageView。

雖然每次都不會拋出這個異常,但是它通過ImageView執行的時間將不會顯示圖像,除非我通過單擊設備的「home」按鈕並恢復應用程序強制刷新。我試圖通過調用forceLayout()和requestLayout()來強制更新/刷新ImageView本身,但不會執行任何操作:(

那麼,任何想法的如何解決這些問題?我應該像Hnadler在Timer/TimerTask?這是甚至可能嗎?它會刷新我的ImageView正確嗎?

回答

2

計時器工作在一個單獨的線程和(我認爲)啓動它的TimerTasks也在一個單獨的線程,你不能更改UI一個非UI線程(主線程)。 正確的方法,是使用處理器(閱讀文檔,很容易使用,但更多的非UI和UI線程之間的原始數據交換),或(在simpliest和更適合你)嘗試:

imageView.post(

new Runnable() { 

     imageView.setBackground(...); 

} );

PS有用:

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable) http://developer.android.com/guide/appendix/faq/commontasks.html#threading

+0

很好,似乎與post()方法的工作! 很高興你提到它,因爲這是我第一次看到它! – TiGer 2010-11-04 11:23:46