SharedPreferences и таймер обратного отсчета

Я хочу сохранить значение CountDown Ttimer в переменной, чтобы в следующий раз, когда пользователь запустит действие Countdowntimer, оно перезагрузилось в точное прошедшее время, как оно осталось. Вот мой код, и я не понимаю, почему он не работает. (это показывает, что текстовое поле моего времени пусто)

prefs = PreferenceManager.getDefaultSharedPreferences(this);
   long timer = prefs.getLong("TIME", 86400000);

   new CountDownTimer(timer, 1000) {

         public void onTick(long elapsed) {
             System.out.print(elapsed);
             long timer2=elapsed;
             long hours = timer2 / hours_in_millies;
             timer2 %= hours_in_millies;
             long minutes = timer2 / minutes_in_millies;
             timer2 %= minutes_in_millies;
             long seconds = timer2 / seconds_in_millies;
             time.setText(hours + ":" + minutes + ":" + seconds);
             SharedPreferences.Editor editor = prefs.edit();
             editor.putLong("TIME",elapsed);
             editor.commit(); 


         }

person AnTz    schedule 07.03.2012    source источник
comment
что вы получаете от ваших системных аутов? Общие настройки работают?   -  person Moritz    schedule 07.03.2012


Ответы (3)


Если я прав, вы немного обновляете общие настройки. Это, наверное, плохая идея. Было бы лучше сохранить отметку времени и время на таймере на onStop, а затем onResume посчитать, сколько времени прошло, и забрать его оттуда.

person Ashterothi    schedule 07.03.2012
comment
И что я буду делать, если приложение закроется? - person AnTz; 07.03.2012
comment
если ваше приложение закрывается, следует вызвать onStop. В этот момент ваш pref будет сохранен. - person Ashterothi; 07.03.2012
comment
Должен ли я использовать editor.commit() в моем классе нажатия кнопки «Назад»? Кроме того, что я буду делать, если таймер истечет? - person AnTz; 07.03.2012
comment
Я не совсем понимаю, как использовать вашу идею, Пиро, не могли бы вы написать на ней простой код? - person AnTz; 07.03.2012

Я не вижу, чтобы ваша переменная timer использовалась в ontick(), вы использовали переменную timer2. Поместите loggerLog.d() перед строкой setText(), чтобы проверить результаты для используемых вами переменных... иначе editText не может быть определенно пустым

Кроме того, сэкономьте время в общих настройках в onStop() вашей активности.. не на каждом тике таймера!

EDIT: После уточнения требования от OP

Возможно, вы захотите использовать другой подход. Скажем, когда должен начаться обратный отсчет. Используйте System.currentTimeMillis(), чтобы получить ВРЕМЯ НАЧАЛА и сохранить его в SharedPreferences/DB.

всякий раз, когда начинается действие... выберите настройки frm START_TIME... и запустите таймер с начальным временем как (System.currentTimeMillis - START_TIME), а onTick() обновите таймер ( интерфейс). ПРИМЕЧАНИЕ. Теперь вам не нужно обновлять значение таймера до SharedPreferences

person Rahul garg    schedule 07.03.2012
comment
Я просмотрел журналы и поместил часть сохранения переменных в свой метод OnBackPressed. Похоже, проблема в long timer = prefs.getLong(TIME, 86400000); , похоже, он всегда начинается снова с этого 86400000. - person AnTz; 07.03.2012
comment
Можете ли вы показать обновленный код вашего... правильный способ - в onTick() сохранить последние минуты/часы/... в локальных (область действия) переменных... и код для обновления общих настроек с помощью эти переменные.... - person Rahul garg; 07.03.2012
comment
О, теперь я понял, что это не то, чего я действительно хотел. Мне просто нужен таймер обратного отсчета, который будет продолжать тикать, даже если действие или приложение закрываются. Кто-нибудь может мне помочь? Нашел пост об этом, но он подразумевает использование Сервисов, о которых я ничего не знаю. - person AnTz; 08.03.2012
comment
да, вы можете сделать это с помощью сервисов. Я отредактировал ответ с альтернативным подходом к нему. - person Rahul garg; 08.03.2012

Решено:

  prefs = PreferenceManager.getDefaultSharedPreferences(this);

   xtime = System.currentTimeMillis()-prefs.getLong("TIME",System.currentTimeMillis()); 

   long timer=86400000-(xtime+prefs.getLong("TIME2",0)); 

   final SharedPreferences.Editor editor = prefs.edit();
   editor.putLong("TIME2",xtime+prefs.getLong("TIME2",0));  
   editor.commit(); 


   new CountDownTimer(timer, 1000) { 

         public void onTick(long elapsed) {

             Log.d(TAG, "TIMER" + System.currentTimeMillis());
             long timer2=elapsed;
             long hours = timer2 / hours_in_millies;
             timer2 %= hours_in_millies;
             long minutes = timer2 / minutes_in_millies;
             timer2 %= minutes_in_millies;
             long seconds = timer2 / seconds_in_millies;
             time.setText(hours + ":" + minutes + ":" + seconds);


         }

         public void onFinish() 
         { Intent intent = new Intent(Hug.this, Hug_Accepted.class);
        startActivity(intent);

         }

   }
   .start();    
   xtime=System.currentTimeMillis(); 
    SharedPreferences.Editor editor2 = prefs.edit();
     editor2.putLong("TIME",xtime);         
     editor2.commit(); 

}
person AnTz    schedule 09.03.2012