Проблема с CountDownTimer на Android

Я пытаюсь реализовать CountDownTimer в приложении для Android. Этот таймер во время работы будет вести обратный отсчет от значения, затем сбрасывать, а затем отсчитывать от другого значения. Переключение назад и принудительное переключение между значениями до тех пор, пока не истечет заданное количество раундов или не будет нажата кнопка остановки. Я могу заставить образцы CountDownTimer работать, но я думаю, что здесь что-то упустил. Ниже приведен применимый код нажатия кнопки;

CounterState state = CounterState.WORKOUT;
private WorkoutTimer workoutTimer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.workout_stopwatch); 
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    // Set up OnClickListeners
    ((Button) findViewById(R.id.start_button)).setOnClickListener(this);
    ((Button) findViewById(R.id.stop_button)).setOnClickListener(this);
    ((Button) findViewById(R.id.reset_button)).setOnClickListener(this);

}

@Override
public void onClick(View v) {       
    switch(v.getId()) {
    case R.id.start_button:
        if (!timer_running) {
            timer_running = true;
            Log.d(TAG, "clicked on Start Button");

            // If the state is unknown, set it to Workout first
            int State = state.getStateValue();
            if (State == 0) {
                state.setStateValue(1);
            }
            workoutTimer.start();
        }
        break;
    case R.id.stop_button:
        Log.d(TAG, "clicked on Stop Button");

        if (timer_running); {
            timer_running = false;
            workoutTimer.cancel();
        }

        break;

private class WorkoutTimer extends CountDownTimer{
    public WorkoutTimer(long interval) {
        super(getThisTime(), interval);
        Log.d(TAG, "WorkoutTimer Constructed...");
    }

    TextView digital_display = (TextView) findViewById(R.id.digital_display);
    TextView numOfRounds = (TextView) findViewById(R.id.number_of_rounds);

    public void onFinish() {
        int State = state.getStateValue();
        int roundsLeft = 0;

        if (State == 1) {
            state.setStateValue(2);
        } else {
            state.setStateValue(1);
        }

        decrementRounds();

        try {
            roundsLeft = Integer.parseInt(numOfRounds.getText().toString());
        } catch(NumberFormatException nfe) {
            roundsLeft = 999;
        }

        if (roundsLeft > 0 || roundsLeft != 999) {
            workoutTimer.start();
        }
    }

    public void onTick(long millisUntilFinished) {
        final long minutes_left = ((millisUntilFinished / 1000) / 60);
        final long seconds_left = (millisUntilFinished / 1000) - (minutes_left * 60);
        final long millis_left = millisUntilFinished % 100;
        String time_left = String.format("%02d:%02d.d", minutes_left, seconds_left, 
                millis_left);
        digital_display.setText(time_left);
    }
}

private long getThisTime() {
    long time = 0;

    TextView workout_time = (TextView) findViewById(R.id.workout_time);
    TextView rest_time = (TextView) findViewById(R.id.rest_time);

    switch(state) {
    case WORKOUT:
        try {
                time = Integer.parseInt(workout_time.getText().toString());
            } catch(NumberFormatException nfe) {
                time = 999;
            } 
//          time = 90;
        Log.d(TAG, "Workout time = " + time);
        break;
    case REST:
        try {
                time = Integer.parseInt(rest_time.getText().toString());
            } catch(NumberFormatException nfe) {
                time = 999;
            } 
//          time = 30;
        Log.d(TAG, "Rest time = " + time);
        break;
    case UNKNOWN:
        time = 0;
        break;
    }
    return time;
}

Все запускается нормально, но вылетает, когда я нажимаю любую кнопку. Если я закомментирую свои вызовы в trainingTimer, сбоев не будет. Я никогда не вижу свой журнал в конструкторе класса trainingTimer, поэтому, очевидно, я что-то здесь упускаю. Любая помощь будет оценена по достоинству.

- Ян


person iYeager    schedule 11.09.2013    source источник


Ответы (1)


Вы не инициализировали тренировочный таймер. Вам нужно добавить следующую строку в метод onCreate.

workoutTimer = new WorkoutTimer(...);
person Doug Lamb    schedule 11.09.2013
comment
Это сработало, по крайней мере, теперь я получаю новую ошибку. Нет идентификатора пакета при получении значения для номера ресурса 0x000 Кажется, в моем вызове setText. - person iYeager; 11.09.2013
comment
Ян, кажется я ответил на вопрос, да? Можете ли вы принять его или хотя бы отметить как полезное? Ваша новая ошибка на самом деле является другим вопросом и потребует проверки ваших файлов ресурсов. Спасибо. - person Doug Lamb; 11.09.2013
comment
Да, вышеописанная проблема была проблемой, и инициализация перед ее вызовом устранила ее. - person iYeager; 11.09.2013