Android миллисекунды - PullRequest
       15

Android миллисекунды

3 голосов
/ 01 января 2012

Итак, я пытаюсь написать приложение для секундомера, которое отображает время в миллисекундах, но по какой-то причине оно не работает. По сути, у меня есть только кнопка, которая после нажатия начинает печатать миллисекунды с момента запуска до текущего времени ... Хотя в симуляторе приложение блокируется. Что не так?

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);
            }

        }
    });
}

}

Ответы [ 2 ]

8 голосов
/ 01 января 2012

Вы определенно не должны запускать занятый цикл, как вы делаете внутри OnClickListener.Вот почему приложение блокируется.Вы должны позволить остальной системе сказать свое слово.Кроме того, не имеет смысла обновлять дисплей чаще, чем раз в 30 миллисекунд или около того, потому что это самый быстрый способ, который может отслеживать человеческий глаз.Кроме того, вы можете приостановить таймер, когда активность приостановлена.Вот версия, которая делает все это:

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;
    }
}
0 голосов
/ 16 мая 2012

Вы добавили метод setText() в onClick(), поэтому будете ли вы нажимать кнопку каждую секунду? Это даже не нить! Вместо этого попробуйте метод onTick() класса CountDownTimer.

...