我有一个使用runnable更新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毫秒的睡眠时间,但它只会在文本发生变化时写入文本,因此实际上它会少于每秒一次
解答:
这有点令人尴尬。问题出在其他代码中。
我在同一个数据包中收到UDP套接字,并将packet.getData读入一个新字符串。 这是将整个数据包复制到字符串中,而不仅仅是在该消息中收到的字节。 第二个问题是我每次都需要调用packet.setLength来设置整个数据包的可用长度。
感谢您的回答!
答案 0 :(得分:4)
你只能在UI线程上更新你的UI,把你的setText()方法放在这个
中runOnUiThread(new Runnable() {
@Override
public void run() {
btn.setText(someValue);
}
});
答案 1 :(得分:3)
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的建议。