Android TextView没有完全更新。

3

我有一个线程,使用一个可运行对象更新textview:

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

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

然而,文本内容无法正确更新。它可以在最开始的几次写入时运行,但之后只写入一半的文本,留下了先前文本的后一半部分。
将屏幕旋转会导致其刷新并正确绘制。
TextView是多行的,我向其中写入一个包含\n字符以表示换行的字符串。
上面的invalidate调用没有任何影响。
有什么想法吗?
更新:mDisplayedText在包含我的线程类的活动中声明。在线程的运行循环中,我调用:
mDisplayedText = getText()
runOnUiThread(updateTextView);

循环包含100毫秒的睡眠时间,但实际上只有在文本发生更改时才会写入,因此实际上不到一秒钟。
答案:
稍微有点尴尬。问题出在其他代码中。
我在同一个数据包中接收UDP套接字,并将packet.getData读取到一个新字符串中。 这将整个数据包复制到字符串中,而不仅仅是接收到的那个消息中的字节。 第二个问题是每次需要调用packet.setLength来设置整个数据包可用的长度。
感谢您的回答!

2
可能无法解决您的问题,但您不需要调用invalidate。 - Karakuri
我看到我错误地阅读了你的问题。你确实正在使用一个带有你发布的Runnable代码的线程。你能发布一下传递这个Runnable的片段吗?你做这个的频率是多少? - Vikram
@vikram - 我添加了更多细节。 - FrinkTheBrave
2个回答

5

您只能在UI线程上更新您的UI,请将setText()方法放在此处。

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

我将其标记为答案,因为它包含了runOnUiThread并且简洁明了。 - FrinkTheBrave

3

Runnable 是一个接口。可以将其视为一组准备好执行的命令。您可以使用 Handler 来处理您的代码:

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 的建议。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接