3

ランナブルを使用してテキストビューを更新するスレッドがあります:

// 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 を呼び出す必要があることでした。

答えてくれてありがとう!

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 を使用してコードを操作できます。

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 に答える