【问题标题】:Countdown timer problems Android倒数计时器问题Android
【发布时间】:2015-09-23 17:48:11
【问题描述】:

我的应用会检查是否有带日期的文件。

如果有一个日期,它会计算今天和那个(未来)日期之间的差值,并初始化一个计时器,以 X 天 Y 小时 Z 分钟 S 秒的方式倒计时直到那个日期。

如果没有文件,则用户可以通过按钮选择日期。程序会将日期存储在文件中并设置倒计时。

有一个删除按钮可以删除日期并选择另一个。此删除按钮应取消计时器,使其停止计数。

当我取消它时计时器不会停止。我的计时器正在滴答作响,但差别是 2 秒而不是 1 秒。它显示 40 38 36... 而不是 40 39 38...

最后,它会将选择的日期存储两次而不是一次。

DatePicker 代码来自here

public class NextVisit extends Activity implements DatePickerFragment.TheListener{
protected Vibrator vibrate;
protected int SECONDS_IN_A_DAY = 24 * 60 * 60;
protected String filePath = "";
protected SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
final long[] pattern = {0, 1000, 500, 1000, 500, 1000, 500, 1000 };
CountDownTimer timer = null;
String dateString = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next_visit);
    final TextView label = (TextView) findViewById(R.id.label);
    final TextView countdown = (TextView) findViewById(R.id.time_visit);
    final Button bDate = (Button) findViewById(R.id.date_button);
    final Button bDelete = (Button) findViewById(R.id.delete_button);
    File dir = new File(getFilesDir(), "loveApp");
    if(!dir.exists())
        dir.mkdirs();
    final File f =  new File(getFilesDir()+"/loveApp"+"/love_date.txt");
    filePath = f.getAbsolutePath();
    vibrate = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    bDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(f.exists()){
                f.delete();
                System.out.println("File deleted successfully");
                bDate.setVisibility(View.VISIBLE);
                label.setText(R.string.next_visit1);
                timer.cancel();
                countdown.setText("");
                System.out.println("I cancelled the timer");

                bDelete.setVisibility(View.INVISIBLE);
                bDate.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        DialogFragment picker = new DatePickerFragment();
                        bDelete.setVisibility(View.VISIBLE);
                        bDate.setVisibility(View.INVISIBLE);
                        picker.show(getFragmentManager(), "datePicker");
                    }
                });

            }
        }
    });

    if(f.exists()){
        System.out.println("File exists");
        bDate.setVisibility(View.INVISIBLE);
        label.setText(getString(R.string.label));
        try{
            BufferedReader br = new BufferedReader(new FileReader(f));
            dateString = br.readLine();
            br.close();
            System.out.println("Date: "+dateString);
            Date finalDate = formatter.parse(dateString);
            setCountdown(finalDate);
        }catch(Exception e){
            e.printStackTrace();
            label.setText("ERROR");
        }

    }else{
        System.out.println("File DOES NOT EXIST");
        bDelete.setVisibility(View.INVISIBLE); //Removing the delete date button
        bDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                DialogFragment picker = new DatePickerFragment();
                bDelete.setVisibility(View.VISIBLE);
                bDate.setVisibility(View.INVISIBLE);
                picker.show(getFragmentManager(), "datePicker");
            }
        });
 }
}
public void setCountdown(Date finishDate){
    long end = finishDate.getTime();
    final TextView countdown = (TextView)  findViewById(R.id.time_visit);
    timer = new CountDownTimer(end, 1000){
        @Override
        public void onTick(long millisUntilFinished) {
            long now = Calendar.getInstance(Locale.GERMANY).getTimeInMillis()+1000;
            long diff =  millisUntilFinished - now;
            long diffSec = diff / 1000;

            long days = diffSec / SECONDS_IN_A_DAY;
            long secondsDay = diffSec % SECONDS_IN_A_DAY;
            long seconds = secondsDay % 60;
            long minutes = (secondsDay / 60) % 60;
            long hours = (secondsDay / 3600);
            countdown.setText(days+ " days, "+ hours + "hours, "+minutes + "m, "+seconds + "s remaining!");
        }

        @Override
        public void onFinish() {
            countdown.setText("done!");
            vibrate.vibrate(pattern,-1);
        }
    }.start();


}


@Override
public void returnDate(String date) {
    dateString = date;
    TextView label = (TextView) findViewById(R.id.label);
    label.setText(R.string.label);
    BufferedWriter bw;
    try {
        bw = new BufferedWriter(new FileWriter(new File(filePath)));
        bw.write(dateString);
        bw.close();
        System.out.println("Saved the file, date is: "+ dateString);
        Date finishDate = formatter.parse(date);
        setCountdown(finishDate);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

【问题讨论】:

  • 能否请您也添加您的日志?
  • 你的意思是所有的输出?我一到家就去。

标签: java android timer countdowntimer


【解决方案1】:

我认为这个字符串 long now = Calendar.getInstance(Locale.GERMANY).getTimeInMillis()+1000; 有问题,你需要把它放在倒数计时器代码之外。

final long now = Calendar.getInstance(Locale.GERMANY).getTimeInMillis()+1000;
timer = new CountDownTimer(end, 1000){
        @Override
        public void onTick(long millisUntilFinished) {
            long diff =  millisUntilFinished - now;
            long diffSec = diff / 1000;
...
};

【讨论】:

  • 我不认为是那样的,否则“现在”在每个刻度中总是相同的,这不是......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多