@Bafrektez

Как сразу изменить время для handler после его изменения в настройках?

Добрый день. В общем, суть проблемы в следующем - есть "помодоро" таймер, в нем можно в настройках изменять время. Но проблема в том, что если, например, закончилось время отдыха, то я не могу изменить время работы, оно меняется только на следующий раз. Как сделать так, чтобы время изменялась сразу же? Спасибо)

MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private final String TAG = "PomodoroTimer count";
    SharedPreferences sharedPreferences;
    private TextView mTimer;
    private Button startButton, pauseButton;
    int TIME_WORK_SESSION;//время работы(в секундах)
    int TIME_REST_SESSION;//время отдыха(в секундах)
    int BIG_REST_SESSION;
    private int seconds;
    private boolean isRunning;
    private boolean isWork;
    private boolean timeStop, workOrRest;
    private boolean textSwitcher = true;
    private int bigTomato = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTimer = (TextView) findViewById(R.id.tv);
        startButton = (Button) findViewById(R.id.startButton);
        pauseButton = (Button) findViewById(R.id.pauseButton);
        startButton.setOnClickListener(this);
        pauseButton.setOnClickListener(this);
        seconds = TIME_WORK_SESSION;
        isWork = true;

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
        seconds= Integer.parseInt(String.valueOf(sharedPreferences.getString("work_time", "5")));
        //Скрыть Action bar
        //getSupportActionBar().hide();
        runTimer();
    }

    @Override
    protected void onResume() {
        TIME_WORK_SESSION = Integer.parseInt(String.valueOf(sharedPreferences.getString("work_time", "5")));
        TIME_REST_SESSION = Integer.parseInt(String.valueOf(sharedPreferences.getString("short_break", "2")));
        BIG_REST_SESSION = Integer.parseInt(String.valueOf(sharedPreferences.getString("big_short", "7")));
        super.onResume();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.startButton:
                textSwitcher = false;
                timeStop = true;
                isRunning = true;
                break;
            case R.id.pauseButton:
                isRunning = false;
        }
    }

    //Настройка тайера
    private void runTimer() {
        final Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
                    int hours = seconds / 3600;
                    int minutes = (seconds % 3600) / 60;
                    int secs = seconds % 60;
                    String time = String.format("%d:%02d:%02d", hours, minutes, secs);
                if (textSwitcher) {
                    if (workOrRest)
                        mTimer.setText("Rest");
                    else mTimer.setText("Work");
                }
                else
                    mTimer.setText(time);
                    if (timeStop) {
                        if (isRunning && isWork && seconds == 0) {
                            int rest;
                            isWork = false;
                            if (bigTomato == 3) { //Уход на большой перерыв
                                rest = BIG_REST_SESSION;
                                bigTomato = -1;
                            } else //Уход на меленький перерыв
                                rest = TIME_REST_SESSION;
                            seconds = rest;
                            textSwitcher = true;
                            workOrRest = true;
                            timeStop = false;
                        } else if (isRunning && !isWork && seconds == 0) {
                            isWork = true;
                            seconds = TIME_WORK_SESSION;
                            timeStop = false;
                            bigTomato += 1;
                            Log.d(TAG, "big Tomato count = " + bigTomato);
                            workOrRest = false;
                            textSwitcher = true;
                        } else if (isRunning) {
                            seconds--;
                        }
                    }
                    handler.postDelayed(this, 1000);//handler.post(this);
                }
        });
    }

    //Создание меню настроек
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuItem menuItem = menu.add(0, 1, 0, "Setting");
        menuItem.setIntent(new Intent(this, Prefs.class));
        return super.onCreateOptionsMenu(menu);
    }
}


Файл настроек
public class Prefs extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.settings);
    }
}
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ответы на вопрос 1
TranE91
@TranE91
Senior Android Engineer
1. Настоятельно рекомендую использовать jodatime
2. Используйте broadcastreceiver
<receiver android:name=".receivers.StartupReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.TIME_SET" />
                <action android:name="ANDROID.INTENT.ACTION.DATE_CHANGED" />
            </intent-filter>
        </receiver>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы