ランナブルを使用してテキストビューを更新するスレッドがあります:
// runnable to allow updating the UI from the thread
Runnable updateTextView = new Runnable() {
public void run() {
mTextView.setText(mDisplayedText);
mTextView.invalidate();
}
};
ただし、テキストは正しく更新されません。最初の数回の書き込みで機能し、その後、テキストの半分だけを書き込み、前のテキストの後半をそこに残します。
画面を回転させると、画面が更新され、正しく描画されます。
テキストビューは複数行であり、行末に \n 文字を含む文字列を書き込みます。
上記の無効化呼び出しは違いはありません。
何か案は?
更新: mDisplayedText は、私のスレッド クラスも含むアクティビティで宣言されています。スレッド実行ループで、次を呼び出します。
mDisplayedText = getText()
runOnUiThread(updateTextView);
ループには 100 ミリ秒のスリープが含まれていますが、テキストが変更されたときにのみ書き込みを行うため、実際には 1 秒に 1 回未満になります。
答え:
これはちょっと恥ずかしい。問題は他のコードにありました。
同じパケットに UDP ソケットを受信し、packet.getData を新しい文字列に読み込んでいました。これは、そのメッセージで受信したバイトだけではなく、パケット全体を文字列にコピーしていました。2 つ目の問題は、パケット全体で利用可能な長さを設定するために毎回 packet.setLength を呼び出す必要があることでした。
答えてくれてありがとう!