首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无尽的CountdownTimer

无尽的CountdownTimer
EN

Stack Overflow用户
提问于 2012-03-16 18:21:31
回答 2查看 3.8K关注 0票数 0

这里我有一个CountDownTimer,我想启动它,然后在一个无限的循环中重新启动,我不知道为什么它不能工作:

代码语言:javascript
复制
 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。问题是,即使我在OnFinish()中调用this.start(),我在使用this.start时也会遇到这个NullPointerException错误。如果能帮上忙我会很感激。谢谢!附言:当计时器低于10秒时,我也有一个问题,在这之后,以下数字会出现,但会有一个奖励数字。(95,85,75...15)。如果在我的:

代码语言:javascript
复制
  if(seconds<10)
        seconds=timer2/1000;   
    else 
    seconds = timer2 / seconds_in_millies;

我会用timer2/10000修改秒数=timer2/1000,它根本不显示数字,而是停在10。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-16 20:50:39

你能做到的..。

在你的oncreate中

代码语言:javascript
复制
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类

代码语言:javascript
复制
 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

}
}

}

希望这能行得通。

票数 1
EN

Stack Overflow用户

发布于 2012-03-16 18:33:58

这会给你一个无限的倒计时计时器。30秒..您可以计算创建新计时器的次数,以获得总时间。像这样

代码语言:javascript
复制
MyCount counter;
counter=new MyCount(30000,1000);
  counter.start();

MyCount类

代码语言:javascript
复制
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;


    }
    }



   }

若要获取经过的总时间...

代码语言:javascript
复制
int time=(n*30)+r1;<--- total time elapsed..

暂停计时器使用

代码语言:javascript
复制
counter.cancel();

恢复使用

代码语言:javascript
复制
counter= new MyCount(s1,1000);
     counter.start();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9735490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档