Бесконечный таймер обратного отсчета

Здесь у меня есть этот CountDownTimer, который я хочу запускать и перезапускать в бесконечном цикле, и я не знаю, почему он не работает:

 prefs = PreferenceManager.getDefaultSharedPreferences(this);

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

   timer=24000-(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) {

        long timer2=elapsed;
        hours = timer2 / hours_in_millies;
        timer2 %= hours_in_millies;
        minutes = timer2 / minutes_in_millies;
        timer2 %= minutes_in_millies;
        Log.v(TAG, "seconds" + seconds);
        if(seconds<10)
            seconds=timer2/1000;   
        else 
        seconds = timer2 / seconds_in_millies;

        if(seconds<10)
        seconds=timer2/100;   

        if(seconds>1&&seconds<2)                
        seconds=0;

          if(hours>=10&&minutes>=10&&seconds>=10)
           time.setText(hours + ":" + minutes + ":" + seconds);
             else 
                 if (hours<10&&minutes>=10&&seconds>=10)
                 time.setText("0"+hours + ":" + minutes + ":" + seconds);            
                else 
                    if (hours<10&&minutes<10&&seconds>=10)
                    time.setText("0"+hours + ":0" + minutes + ":" + seconds);
                else 
                    if (hours>=10&&minutes<10&&seconds<10)
                    time.setText("0"+hours + ":0" + minutes + ":0" + seconds);
                else 
                    if(hours>=10&&minutes>=10&&seconds<10)
                         time.setText(hours + ":" + minutes + ":0" + seconds);
                else 
                        if (hours>=10&&minutes<10&&seconds<10)
                         time.setText(hours + ":0" + minutes + ":0" + seconds);
                        else 
                            if(hours>=10&&minutes<10&&seconds>=10)
                             time.setText(hours + ":0" + minutes+":" + seconds);
                            else if(hours<10&&minutes>=10 && seconds<10)
                                 time.setText("0"+hours + ":" + minutes +":0"+ seconds);


     }

     public void onFinish() 
     {  editor.clear();            
        this.start();
     }

  }.start();

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

}

SharedPreferences помогает мне восстановить CountDownTimer с того момента, когда действие закончилось с использованием моего алгоритма. Проблема в том, что даже если я вызываю this.start() в моем OnFinish(), у меня есть эта ошибка NullPointerException в строке с this.start. Буду признателен за помощь. Благодарю вас! P.S: У меня тоже проблема, когда таймер опускается ниже 10 секунд, после чего появляются следующие числа, но с бонусной цифрой. (95,85,75...15). Если в моем:

  if(seconds<10)
        seconds=timer2/1000;   
    else 
    seconds = timer2 / seconds_in_millies;

Я бы изменил second=timer2/1000 на timer2/10000, он вообще не показывает числа и останавливается на 10.


person AnTz    schedule 16.03.2012    source источник


Ответы (2)


Ты можешь сделать это..

в вашем oncreate

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);

 Date date = (Date)settings.getString("date",0);
 Calendar c = Calendar.getInstance(); 
        Date d=c.getTime();
long diffInMs = d.getTime() - date.getTime();
long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMis);
if (diffInSec>86400)
{
 SharedPreferences myPrefs = this.getSharedPreferences("PREFS_NAME",0);
SharedPreferences.Editor ed = myPrefs.edit();
ed.putString("Date", String.valueOf(d));
ed.commit();
  //allow your activity to open
}
 else
{
 counter= new MyCount(diffInSec*1000,1000);
 counter.start();
 }

Класс MyCount

 public class MyCount extends CountDownTimer{
 public MyCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onFinish() {
    Intent k=new Intent(Myactivity.this,Myactivity.class);
                 startActivity(k);
}
@Override
public void onTick(long millisUntilFinished) {
    s1=millisUntilFinished;
     <---- display s1/1000 to show number of seconds left

}
}

}

надеюсь, это сработает..

person 5hssba    schedule 16.03.2012

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

MyCount counter;
counter=new MyCount(30000,1000);
  counter.start();

Класс MyCount

public class MyCount extends CountDownTimer{
    public MyCount(long millisInFuture, long countDownInterval) {
    super(millisInFuture, countDownInterval);
    }
    @Override
    public void onFinish() {
        counter= new MyCount(30000,1000);
     counter.start();
     n=n+1;
    }
    @Override
    public void onTick(long millisUntilFinished) {
        s1=millisUntilFinished;
        r1=(30000-s1)/1000;


    }
    }



   }

чтобы получить общее время, прошедшее...

int time=(n*30)+r1;<--- total time elapsed..

чтобы приостановить использование таймера

counter.cancel();

возобновить использование

counter= new MyCount(s1,1000);
     counter.start();
person 5hssba    schedule 16.03.2012
comment
Я считаю, что ваш код хорош, мне нужно знать, как его реализовать (я не очень хорошо разбираюсь в разработке Android). Итак, мне нужно скопировать этот класс My Count в свой код, а затем? Кроме того, мне не нужно знать общее прошедшее время, поэтому я удалю эту часть. - person AnTz; 16.03.2012
comment
в вашей деятельности.. после oncreate вставьте этот класс MyCount.. затем в методе oncreate деятельности.. поместите этот код.. счетчик MyCount; counter=new MyCount(30000,1000);; счетчик.старт(); - person 5hssba; 16.03.2012
comment
Что мне делать с моими SharedPreferences, их нужно удалить, чтобы перезапустить таймер. - person AnTz; 16.03.2012
comment
эээ ... я ничего не вижу об общем приоритете в вашем коде ... просто предложил вам реализовать непрерывный таймер обратного отсчета, подобный этому ... - person 5hssba; 16.03.2012
comment
Мне нужно перезапустить всю активность с помощью CountDownTimer только во второй раз, когда все SharedPreferences очищены (editor.clear()). Но каким-то образом, если я перезапущу действие, мой CountDownTimer не перезапустится. - person AnTz; 16.03.2012