0

我正在尝试制作倒数计时器。我想出了这段代码,最初我认为它有效。但是,当我运行该应用程序时,发生了两件事,我不知道如何解决...

  1. 它不同步,虽然它是系统时间和日期,它说只剩下 60 天而不是 61 天,而我知道它是 61!
  2. 如果我关闭应用程序并返回它会重置计数器...

对此的任何帮助将不胜感激,它不是针对任何特定的个人项目。

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final TextView dateBx = (TextView) findViewById(R.id.textView1);
        final TextView mTextField = (TextView) findViewById(R.id.mTextField);
        final TextView minBx = (TextView) findViewById(R.id.minBx);
        final TextView hourBx = (TextView) findViewById(R.id.hourBx);

        //set todays date
        DateFormat dateFormat1 = new SimpleDateFormat("dd/MM/yyyy");
        Calendar cal1 = Calendar.getInstance();
        //target date
        DateFormat dateFormat2 = new SimpleDateFormat("dd/MM/yyyy");
        Calendar cal2 = Calendar.getInstance();
        cal2.set(2012,11,25);
        //set maths
        long time1 = cal1.getTimeInMillis();
        long time2 = cal2.getTimeInMillis();
        //difference variable
        long diff = time2 - time1;
        //equations
        long diffSec = diff / 1000;
        long dMins = diff / (60 * 1000);
        long dHour = diff / (60 * 60 * 1000);
        long dDay = diff / (24 * 60 * 60 * 1000);

       new CountDownTimer(diff, 1000) 
       {

             public void onTick(long millisUntilFinished) 
             {
                 mTextField.setText("Seconds remaining: " + millisUntilFinished / 1000);
                 dateBx.setText("Days remaining: " + millisUntilFinished / (24 * 60 * 60 * 1000));
                 minBx.setText("Minutes remaining: " + millisUntilFinished / (60 * 1000));
                 hourBx.setText("hours remaining: " + millisUntilFinished / (60 * 60 * 1000));
             }

             public void onFinish() {
                 mTextField.setText("done!");
             }
          }.start();



}

我的代码是我在 java 和 android 中学到的一些东西的组合,如果你想出更好的方法来一起做,请告诉我:)

谢谢

4

2 回答 2

1

Android 不是实时操作系统,因此您可以计算出您的计时器将精确地每 1000 毫秒运行一次。

最实用的方法是,对于每次调用,获取当前日期,获取目标日期,并重新计算剩余的天数/小时/分钟/秒(就像您在应用程序开始时所做的那样)。

在关闭/打开您的应用程序时,这也将解决您的问题。

于 2012-10-25T22:04:09.977 回答
1

这是一个如何同步 countDownTimer 的示例。

(因为“onTick()”根据 Android 不准确)

诀窍是只使用“onFinish()”并使用接口启动一个新计时器。

做一个 countDownTimer 的扩展类:

public class oneShotTimer extends CountDownTimer {
    TickListener invokeOnFinish;    // Interface

public oneShotTimer (Context parent, int tickTime, TickListener contextPointer) {
    super(tickTime, tickTime);          // DEBUG: (/60)
....
}

在 OnFinish() 处:

 public void onFinish() {
     invokeOnFinish.restartTimer();    
 }
 public void onTick() {
     Log.e("Timer", "Not suppose to happen");
 }

定义一个接口:

public interface TickListener {
    public void restartTimer();
}

现在在父对象执行以下操作:

1) 在启动定时器之前,在 MillinSecond -> "startTime" 中获取时间;

2)为“TickListener::restartTimer”创建方法(我写了psadu代码)

@Override
public void restartTimer() {
    // check if timer is done (make your own variable to monitor that)

    // get the currentTime in MilliSecond

    // calc TickTime , if we know that 30 tick are already counted 
    // there for ((30+1) x wantedTickTime) give us the target time for the next tick.
    // TickTime = (31 x wantedTickTime) - (currentTime - startTime)  
    // for example, we want 1sec ticks, after 30 ticks it finished at 30.2 sec
    // => (31 x 1) - (40.2 - 10)  = 0.8 is the time we need to re start timer.

    // re-run a new Timer with the new TickTime 
}

现在让我们看看 Java 垃圾收集将如何处理它。

于 2015-07-16T01:16:35.590 回答