3

だから私はミリ秒単位で時間を表示するストップウォッチアプリを書こうとしていますが、何らかの理由でそれは機能しません。基本的に、トグルボタンを押すだけで、開始時刻から現在の時刻までのミリ秒の印刷が開始されます...ただし、シミュレーターでは、アプリがロックされます。どうしたの?

public class testing extends Activity {
/** Called when the activity is first created. */
Button start,stop;
long init,now,time;
TextView display;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    display = (TextView) findViewById(R.id.chronometer1);
    final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff);
    passTog.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            init=System.currentTimeMillis();
            while(passTog.isChecked())
            {
                now=System.currentTimeMillis();
                time=now-init;
                display.setText("t: " + time);
            }

        }
    });
}

}

4

2 に答える 2

8

OnClickListener内で実行しているように、ビジーループを実行しないでください。そのため、アプリがロックされます。システムの残りの部分に発言権を持たせる必要があります。また、表示を30ミリ秒ごとに2回以上更新することは意味がありません。これは、人間の目が追跡できる速度の約1倍だからです。また、アクティビティが一時停止しているときにタイマーを一時停止することもできます。これがすべてを行うバージョンです:

public class testing extends Activity {

    /** Called when the activity is first created. */
    Button start,stop;
    long init,now,time,paused;
    TextView display;
    Handler handler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler = new Handler();
        setContentView(R.layout.test);
        display = (TextView) findViewById(R.id.chronometer1);
        final ToggleButton passTog = (ToggleButton) findViewById(R.id.onoff);
        final Runnable updater = new Runnable() {
            @Override
            public void run() {
                if (passTog.isChecked()) {
                    now=System.currentTimeMillis();
                    time=now-init;
                    display.setText("t: " + time);
                    handler.postDelayed(this, 30);
                }
            }
        };
        passTog.setOnClickListener(new View.OnClickListener() {

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

    @Override
    protected void onPause() {
        super.onPause();
        paused = System.currentTimeMillis();
    }

    @Override
    protected void onResume() {
        super.onResume();
        init += System.currentTimeMillis() - paused;
    }
}
于 2012-01-01T17:53:09.903 に答える
0

setText()メソッドをに入れたonClick()ので、毎秒ボタンをクリックしますか?それもスレッドではありません!代わりにクラスのonTick()メソッドを試してください。CountDownTimer

于 2012-05-15T23:10:49.270 に答える