0

だから私は「あなたに言ってない」でアプリを作っています... :-)

問題に行く:

   final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff);

passTog.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    init = System.currentTimeMillis();
                    handler.post(updater);
                }
            });

上記は通常のトグル ボタンです。以前にハンドラーを定義しました。これを使用して、Runnable という名前のアップデーターを実行しています... (以下では、「表示」はテキストビューです)

final Runnable updater = new Runnable() {
            @Override
            public void run() {
                if (passTog.isChecked()) {
                    now = System.currentTimeMillis();
                    time = now - init;
                    display.setText(time + " ms");
                    handler.postDelayed(this, 30);
                }
            }
        };

そして、これがランナブルです... 変数 time, now, init ... は時間変数です。

私がやろうとしているのは(今)トグルボタンが押されてから経過したミリ秒でテキストビューを更新していることです(ifステートメントを参照してください)

上記コードの説明

アクティビティが開始され、トグル ボタンをクリックすると、init 変数が現在の時刻の値を取得します... プログラムはランナブルに移行します。さて、ボタンが実際に「オン」の状態であることを再確認した後...システムは現在の時間を「今」に置きます...そして、2つの減算として時間変数があります。そして、それはテキストビューの「表示」で30ミリ秒ごとに更新されます。アプリでは、時間が経過するにつれてテキストビューのペーシングを確認できます。よく働く。

それはそれで、私が欲しいのは...

アクティビティが開始されたら、ボタンを押します .2 秒から 10 秒の間のランダムな時間遅延*の後..その後、テキストビューの更新が開始されます。

ボタンを押しても、何も起こらないように見えます。その後、ランダムな遅延が発生します...テキストビューがバーストし、1 ミリ秒から現在の時刻を大量に生成し始めます。つまり、上記のランナブルはランダムな時間遅延の後に実行する必要があります。

問題のように見ることは完全に論理的であり、実際には技術的ではありません-ランナブルが機能する前に、何らかの方法で固定されていない時間遅延を導入する必要があります。

ランナブル自体でこれを行うことができると思います...すでに「時間」変数があります....「if」ステートメントでそれを使用しないでください....そして時間変数をリセットして最初から始まるようです。

重いもの、私はそれを正しく理解できないようです。

これを行う方法はありますか?

4

3 に答える 3

2

ランナブルの最初の投稿を単に遅らせるのはどうですか?

public void onClick(View v) {
    init = System.currentTimeMillis();
    handler.postDelayed(updater, 2000+(new Random().nextInt(8000));
}

最小 2000ms および最大 9999ms の後、TextView の更新が開始されます。ボタンがクリックされたときの初期時間は変わりません。初期化時間も遅延させたい場合は、これを試してください:

public void onClick(View v) {
    init = -1;
    handler.postDelayed(updater, 2000+(new Random().nextInt(8000));
}



final Runnable updater = new Runnable() {
            @Override
            public void run() {
                if (passTog.isChecked()) {
                    if(init == -1) init = System.currentTimeInMillis();
                    now = System.currentTimeMillis();
                    time = now - init;
                    display.setText(time + " ms");
                    handler.postDelayed(this, 30);
                }
            }
        };

それはあなたが達成したかったことですか、それとも私の理解が間違っていましたか?

于 2013-09-19T12:56:46.113 に答える
0
new CountDownTimer(2000, 1000) {
                  //currently time delay is 2000 milliseconds
            @Override
            public void onFinish() {
                // TODO Auto-generated method stub
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        // do your task here

                    }
                });
            }

            @Override
            public void onTick(long millisUntilFinished) {
            }
        }.start();
于 2013-09-19T13:22:50.353 に答える