0

最近、古いプロジェクトをリファクタリングしましたが、何をしても特定の部分が適切に実行されたくないことがわかりました。基本的に、TextViewを使用したアクティビティがあります。このビューは、同じクラス内で呼び出されたスレッドから一定の間隔で更新されます。一時停止はThread.sleepで実行され、ハンドラーを使用してUIの更新をトリガーします。問題は、別のスレッドからビューを操作できないというCalledFromWrongThreadExceptionが発生するか、長い一時停止の後にすべてのテキストが一度にビューにヒットするか、すぐに起動してまったくスリープしないように見えることです。私は以前そのようにそれをしていました(関連する部分が含まれています):

public class Updated extends Activity implements Runnable {

private TextView textView;
private String text;
private Handler handle = new Handler(){
    @Override
    public void handleMessage(Message msg){
        textView.append(text);
    }
};
//onCreate and other such things...{
    new Thread(this).start();
}

public void run(){
     //A healthy chunk of logic/conditionals
     text = "Blah blah";
     handle.sendEmtpyMessage(0);
     try {
    Thread.sleep(1500l);
 } catch (InterruptedException e) {
    e.printStackTrace();
 }
}

それが私が以前使っていたものの要点であり、うまくいきました。ただし、クラス変数を設定し、後でハンドラーに取得させるという方法は本当に好きではありませんでした。.objフィールドが文字列に設定されたメッセージを渡すように変更しました。文字列は剥がされてTextViewに追加されます。これは、前述の例外を除いて爆発します。Handler宣言をそのままにしてみましたが、その中のロジックを、Handlerが.post(Runnable(){});になる別のメソッドに移動しました。同じ根性を持っていますが、それはかなりの待機の後に失速して追加するだけです。私はJava/Android内のハンドラーとスレッドの内部動作にそれほど精通していないので、どんなポインターでも大歓迎です。

4

1 に答える 1

2

ハンドラーを静的に作成し、ローダースレッドで作成します。onCreate()でハンドラーを作成すると、UIスレッドにバインドされ、問題が解決します。また、Thread.sleepの代わりに、メッセージを受信するたびにhandler.sendEmptyMessageDelayedを実行し、最初のメッセージを送信するだけで開始できます。ハンドラーのThread.sleepがスレッドを詰まらせる可能性があると思います。

于 2012-11-25T07:07:09.083 に答える