3

我有一个使用可运行对象更新文本视图的线程:

// 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 来设置整个数据包可用的长度。

感谢您的回答!

4

2 回答 2

5

你只能在 UI 线程上更新你的 UI,把你的 setText() 方法放在这个里面

runOnUiThread(new Runnable() {
   @Override
   public void run() {
      btn.setText(someValue);
   }
});
于 2013-07-20T23:00:34.527 回答
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 的建议。

于 2013-07-20T21:46:36.300 回答