2014-04-10 78 views
1

在一個線程,當我收到東西從互聯網上我要通知用戶,我這樣做Android的看法不刷新

new Thread(new Runnable(... 
    ... 
    Log.d("tag", "going to redraw"); 
    findViewById(R.id.view).setVisibility(View.VISIBLE); 
    findViewById(R.id.view).refreshDrawableState(); // tried this 
    findViewById(R.id.view).invalidate(); // and this together and separately 
).start(); 

總是查看日誌,並有時看到顯示的視圖。我不知道發生了什麼

我試圖將findViewById包含在runOnUIThread中,但那也沒有完成這項工作。對此有任何提示?

+1

你試過'postInvalidate()'而不是'invalidate()'嗎? – codeMagic

+0

@codeMagic仍然不能正常工作 – Thomas

+0

在此之前,您有'VISIBILITY'作爲'GONE'或'INVISIBLE'嗎? – codeMagic

回答

2

不要在UI線程以外的線程中修改UI!或者使用HandlerActivity.runOnUiThread()

+0

其實我在做'if ... findViewById(...)...去除其他可見'然後'runOnUIThread(.. .invalidate)'。把所有東西放到'UIThread'似乎現在可以工作 } – Thomas

+0

你能舉個例子嗎? – Meir

0

當你不在主Thread您需要通過事件循環的View使用postInvalidate()代替invalidate()

From the docs

原因的無效發生在隨後的週期。使用它來使非UI線程中的視圖無效。

From the docs for invalidate()

這必須從UI線程調用。