2013-07-20 96 views
3

我有一個線程,其更新使用可運行一個TextView:的Android的TextView沒有完全更新

// runnable to allow updating the UI from the thread 
Runnable updateTextView = new Runnable() { 

    public void run() { 
     mTextView.setText(mDisplayedText); 
     mTextView.invalidate(); 
    } 
}; 

但是,文本不正確更新。它適用於最初的幾次寫入,然後只寫入一半的文本,而將前一段文本的後半部分留在那裏。

轉動屏幕使其刷新並正確繪製。

該textview是多行,我寫了一個字符串,它包含\ n字符的行尾。

上面的無效調用沒有區別。

任何想法?

更新:mDisplayedText在也包含我的線程類的活動中聲明。在線程運行的循環,我呼籲:

mDisplayedText = getText() 
runOnUiThread(updateTextView); 

的環路含有100毫秒的睡眠,但只寫文字時,它已經更改,因此在現實中,它會少於一次第二

ANSWER :

有點尷尬。問題出在其他代碼中。

我正在收到一個UDP套接字到同一個數據包,並將packet.getData讀入一個新的字符串。 這是將整個數據包複製到字符串中,而不是僅在該消息中收到的字節。 第二個問題是我需要每次調用packet.setLength來設置整個數據包的可用長度。

感謝您的答案!

+2

可能不會解決您的問題,但你並不需要的無效電話。 – Karakuri

+0

我看到我錯誤地閱讀了你的問題。您確實正在使用您發佈的Runnable代碼的線程。你可以在你傳遞這個Runnable的地方發佈代碼片段嗎?你多頻繁地這樣做? – Vikram

+0

@vikram - 我已經添加了一些更多的細節 – FrinkTheBrave

回答

4

你只能更新您的UI線程UI,把你的setText()方法在這裏面

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     btn.setText(someValue); 
    } 
}); 
+0

我將其標記爲答案,因爲它包含runOnUiThread並且簡潔 – FrinkTheBrave

+0

感謝那:) –

2

Runnable是一個接口。把它看作一組準備執行的命令。您可以使用處理程序來處理您的代碼:

Handler textViewHandler = new Handler(); 

// runnable to allow updating the UI from the thread 
Runnable updateTextView = new Runnable() { 

    public void run() { 
     mTextView.setText(mDisplayedText); 
    } 
}; 

textViewHandler.post(updateTextView); 

另外,請考慮@ Karakuri的建議。