handler.postDelayed не работает правильно - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть простая часть кода секундомера. Поток работает в пользовательском классе, он подключается к основному действию через интерфейс

public class MainActivity extends AppCompatActivity implements MainActivityInteractionInterface{

public static boolean isRunning = false;
Stopwatch stopWatch;
private TextView textViewMilliSeconds;
private TextView textViewSeconds;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textViewMilliSeconds = findViewById(R.id.textViewStopwatchMilliseconds);
    textViewSeconds = findViewById(R.id.textViewStopwatchSeconds);

    stopWatch = new Stopwatch(this, getApplicationContext());
    stopWatch.runThread();
}

@Override
public void updateUI() {
    String time = String.format(Locale.getDefault(), "%03d", stopWatch.getMilliseconds());
    textViewMilliSeconds.setText(time);

    String timeSeconds = String.format(Locale.getDefault(), "%02d", stopWatch.getSeconds());
    textViewSeconds.setText(timeSeconds);
}

public void startTimer(View view) {
    isRunning = !isRunning;
}

public class Stopwatch {
private int milliseconds = 0;
private int seconds = 0;

public int getMilliseconds() {
    return milliseconds;
}

public int getSeconds() {
    return seconds;
}

private MainActivityInteractionInterface interactionInterface;
private Context applicationContext;

public Stopwatch(MainActivityInteractionInterface interactionInterface, Context applicationContext){
    this.interactionInterface = interactionInterface;
    this.applicationContext = applicationContext;
}

public void runThread(){
    final Handler handler = new Handler();
    handler.post(new Runnable(){
        @Override
        public void run(){
            if(isRunning) {
                milliseconds++;
                if (milliseconds == 1000) {
                    milliseconds = 0;
                    seconds++;
                    if(seconds == 60){
                        seconds = 0;
                    }
                }
            }
            interactionInterface.updateUI();
            handler.postDelayed(this, 1);
        }
    });
}

Обработчик должен обновляться каждые 1 миллисекунду c, когда есть 1000 миллисекунд, проходит 1 секунда Если я установлю задержку handler.postDelayed, то значение меньше 15 до 1000 миллисекунд займет ровно 18 секунд, почему?

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Я не знаю, почему это займет до 18 секунд, но я могу сказать вам следующее: Android refre sh интерфейс каждые 16 мсек c (для скорости 60fps), поэтому установите обработчик updateUI в меньшее время не имело бы смысла и, возможно, также мешало бы ему.

По моему скромному мнению, сделайте так, чтобы оно обновлялось через 20 мсек c и изменяло значения счетчика в соответствии с как это:

handler.post(new Runnable(){
    @Override
    public void run(){
        if(isRunning) {
            milliseconds++;
            if (milliseconds == 50) {
                milliseconds = 0;
                seconds++;
                if(seconds == 60){
                    seconds = 0;
                }
            }
        }
        interactionInterface.updateUI();
        handler.postDelayed(this, 20);
    }
});
0 голосов
/ 05 апреля 2020

Посмотрите на второй аргумент handler.postDelayed(this, 1);

Измените его в соответствии с тем, как вы увеличиваете свои миллисекунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...