Таймер обратного отсчета считает 2 секунды за каждую 1? Android-приложение

Я пытаюсь сделать простой таймер обратного отсчета, который отображает дни, часы, минуты и секунды до события, я до сих пор заставил этот код работать, однако он отсчитывает 2-секундные интервалы вместо одного EX: (10, 8, 6, 4...) Я не понимаю, почему он это делает, я думаю, что все расчеты времени я сделал правильно, есть что-то, что я упускаю? он считает 2 секунды за каждую 1 секунду...

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.R.string;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;


public class MainActivity extends Activity {

     /** Called when the activity is first created. */


   TextView tv;

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

        tv  = (TextView)findViewById(R.id.textView2);

        SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
        formatter.setLenient(false);

        String oldTime = "13.11.2014, 00:00";
        Date oldDate;
        try {
            oldDate = formatter.parse(oldTime);
             milliseconds = oldDate.getTime();

            //long startTime = System.currentTimeMillis();
            // do your work...
            long endTime=System.currentTimeMillis();

             diff = endTime-milliseconds;       

            Log.e("day", "miliday"+diff);
            long seconds = (long) (diff / 1000) % 60 ;
            Log.e("secnd", "miliday"+seconds);
            long minutes = (long) ((diff / (1000*60)) % 60);
            Log.e("minute", "miliday"+minutes);
            long hours   = (long) ((diff / (1000*60*60)) % 24);
            Log.e("hour", "miliday"+hours);
            long days = (int)((diff / (1000*60*60*24)) % 365);
            Log.e("days", "miliday"+days);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        Long serverUptimeSeconds = (System.currentTimeMillis() - milliseconds) / 1000;

            String serverUptimeText = String.format("%d days %d hours %d minutes %d seconds",
            serverUptimeSeconds / 86400,
            ( serverUptimeSeconds % 86400) / 3600 ,
            ((serverUptimeSeconds % 86400) % 3600 ) / 60,
            ((serverUptimeSeconds % 86400) % 3600 ) % 60
            );


        Log.v("jjj", "miliday"+serverUptimeText);
        MyCount counter = new MyCount(milliseconds,1000);
        counter.start();

    }


    // countdowntimer is an abstract class, so extend it and fill in methods
    public class MyCount extends CountDownTimer {
        public MyCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }


        @Override
        public void onFinish() {
            tv.setText("done!");
        }

        @Override
        public void onTick(long millisUntilFinished) {
            //tv.setText("Left: " + millisUntilFinished / 1000);

            long diff = endTime - millisUntilFinished; 
            Log.e("left", "miliday"+diff);
            long seconds = (long) (diff / 1000) % 60 ;
            //Log.e("secnd", "miliday"+seconds);
            long minutes = (long) ((diff / (1000*60)) % 60);
            //Log.e("minute", "miliday"+minutes);
            long hours   = (long) ((diff / (1000*60*60)) % 24);
            //Log.e("hour", "miliday"+hours);
            int days = (int)((diff / (1000*60*60*24)) % 365);
            Log.v("days", "miliday"+days);


            Long serverUptimeSeconds = 
                    (System.currentTimeMillis() - millisUntilFinished) / 1000;


                String serverUptimeText = 
                String.format("%d days %d hours %d minutes %d seconds",
                serverUptimeSeconds / 86400,
                ( serverUptimeSeconds % 86400) / 3600 ,
                ((serverUptimeSeconds % 86400) % 3600 ) / 60,
                ((serverUptimeSeconds % 86400) % 3600 ) % 60
                );  

                Log.v("new its", "miliday"+serverUptimeText);

             // tv.setText(days +":"+hours+":"+minutes + ":" + seconds);

                tv.setText(serverUptimeText);
        }
    }

}

person Michael Campbell    schedule 19.10.2014    source источник
comment
Значение millisUntilFinished в onTick - это время до события. Вам нужно преобразовать его в формат дней/часов/минут. Итак, в основном, просто сделайте diff = millisUntilFinished, и все должно работать.   -  person kiruwka    schedule 27.10.2014


Ответы (1)


Вот код, который я использую в общедоступном классе MainActivity extends Activity{ TextView dayView; TextView timeView; Текстовое представление котировки; длинный дифференциал; длинный endMilliseconds; длинное время окончания; интервал мин = 1; интервал макс = 445; целое случайное число = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    dayView = (TextView) findViewById(R.id.textViewDateDays);
    timeView = (TextView) findViewById(R.id.textViewDateTime);
    SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy, HH:mm");
    formatter.setLenient(false);



    String endTime = "7.08.2015, 00:00";
    Date endDate;
    try {
        endDate = formatter.parse(endTime);
        endMilliseconds = endDate.getTime();
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    MyCount counter = new MyCount(endMilliseconds - System.currentTimeMillis(),1000);
    counter.start();
}



// countdowntimer is an abstract class, so extend it and fill in methods
public class MyCount extends CountDownTimer {
    public MyCount(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    @Override
    public void onFinish() {
        dayView.setText("done!");
    }

    @Override
    public void onTick(long millisUntilFinished) {

        Long serverUptimeSeconds = millisUntilFinished / 1000;

        String serverUptimeText = 
            String.format("%d Hours : %d Minutes : %d Seconds",
            (serverUptimeSeconds % 86400) / 3600 ,
            ((serverUptimeSeconds % 86400) % 3600 ) / 60,
            ((serverUptimeSeconds % 86400) % 3600 ) % 60
            );  

            dayView.setText(Long.toString(serverUptimeSeconds / 86400));
            timeView.setText(serverUptimeText);

    }
}

}

person shinjuo    schedule 24.10.2014
comment
Это исправление только заставило его произвести завершение вместо обратного отсчета ... не совсем понятно, почему - person Michael Campbell; 26.10.2014