0

ロード画面があり、ロードメッセージ2を表示するよりも3秒間loadingMessage1を表示したいのですが、ロードメッセージ2を1回だけ表示したいのですが、それを実行しようとすると、ロードメッセージ2が無限のループで追加され続けました。

だから私はメッセージ2を追加するたびにカウント変数を増やしてみましたが、うまくいきません。どこが間違っているのですか、これに対する別の解決策はありますか?

final TextView loadingMessage1 = (TextView)this.findViewById(R.id.loadingMessage1);
int count = 0;
final Handler handler = new Handler();

if (count == 0){
    handler.post(new Runnable(){    
            @Override
            public void run(){
                loadingMessage1.append("Loading Message 2");
                handler.postDelayed(this, 3*1000L);
            }   
    }); 
    count++;
}
4

2 に答える 2

1

各実行後に別のイベントを投稿しないようにする必要があります。おそらく、次のようなものです。

void showMessage1() {
    // ... code to show message 1 ...

    handler.postDelayed(new Runnable(){    
        @Override
        public void run(){
            showMessage2();
        }   
    }, 3*1000L); 
}

void showMessage2() {
    // ... code to show message 2 ... 
}

メッセージを表示するコードは、メッセージごとに 1 回だけ実行されることに注意してください。

于 2012-07-30T13:56:27.537 に答える
1

次の行で間違いを犯しています。

handler.postDelayed(this, 3*1000L);

ここではRunnable、処理中にこのオブジェクトをハンドラーに送信しますthis。つまり、最初に を実行するRunnableと、最後にハンドラーのメッセージ ループに再度追加されます。したがって、無限ループが得られます。似たようなものがあなたの問題を解決します:

final TextView loadingMessage1 = (TextView)this.findViewById(R.id.loadingMessage1);
int count = 0;
final Handler handler = new Handler();

handler.postDelayed(new Runnable(){    
        @Override
        public void run(){
            loadingMessage1.append("Loading Message 2");
        }   
}, 3*1000L); 

編集:

これらすべてを柔軟にするには、次のようにします。

// inner class
class TextChanger implements Runnable {
    private final String message;

    public TextChanger(String message) {
        this.message = message;
    }

    @Override
    public void run() {
        loadingMessage1.append(message);
    }

}

そして、コードのどこかに:

public static final long TIME_CONSTANT = 3*1000L;

final TextView loadingMessage1 = (TextView)this.findViewById(R.id.loadingMessage1);
int count = 0;
final Handler handler = new Handler();

handler.postDelayed(new TextChanger("Whatever 1"), TIME_CONSTANT);
handler.postDelayed(new TextChanger("Whatever 2"), 2 * TIME_CONSTANT);

等々。トリックはthis、無限ループが作成されるため、以前のように参照しないことです。

于 2012-07-30T14:00:48.080 に答える