CountDownTimer работает в Android Studio, не работает на устройстве - PullRequest
0 голосов
/ 01 мая 2018

Я впервые задаю вопрос здесь, и я довольно новичок в разработке java и android. Я хотел создать простое приложение, которое имеет CountDownTimer и запускает обратный отсчет при запуске приложения. В strings.xml есть определенные даты, которые также анализируются перед преобразованием в даты. Подскажите, пожалуйста, почему мой CountDownTimer работает на виртуальном устройстве android studio, а не на моем реальном устройстве? Заранее спасибо.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    TextView helloTextView = findViewById(R.id.helloTextView); //set the textView
    final TextView countDownTextView = findViewById(R.id.countdownTextView); //set the textView
    TextView untilTextView = findViewById(R.id.untilTextView); // set the textView
    Random rand = new Random();
    int n4 = rand.nextInt(3);


    final TypedArray bgImg = getResources().obtainTypedArray(R.array.bgImg);
    int backgroundID = bgImg.getResourceId(n4, 3);
    final ImageView background = findViewById(R.id.bgImgView);
    background.setImageResource(backgroundID);
    Button complimentBtn = findViewById(R.id.complimentBtn);
    complimentBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(MainActivity.this, Compliment.class));
        }
    });


    Button funnyBtn = findViewById(R.id.funnyBtn);
    funnyBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            startActivity(new Intent(MainActivity.this, Pop.class));
        }
    });


    SimpleDateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss");

    final int n1 = rand.nextInt(8);

    Date rightNow = Calendar.getInstance().getTime();
    final Date firstDate;
    final Date secondDate;
    final Date thirdDate;
    final Date endOfFirstDate;
    final Date endOfSecondDate;
    final String[] words = getResources().getStringArray(R.array.words);
    final String[] dates = getResources().getStringArray(R.array.dates);
    helloTextView.setText("Hello " + words[n1] + "!");
    untilTextView.setText("until then);


    try {
        firstDate = formatter.parse(dates[0]);
        secondDate = formatter.parse(dates[1]);
        thirdDate = formatter.parse(dates[2]);
        endOfFirstDate = formatter.parse(dates[3]);
        endOfSecondDate = formatter.parse(dates[4]);

    } catch (ParseException e) {
        e.printStackTrace();
        return;
    }
    Date untilNextDate = firstDate;

    if (rightNow.before(firstDate)){
        untilNextDate = firstDate;
    }
    else if (rightNow.after(firstDate) && rightNow.before(endOfFirstDate))
    {
        untilNextDate = endOfFirstDate;
    }else if (rightNow.after(endOfFirstDate) && rightNow.before(secondDate)) {
        untilNextDate = secondDate;

    } else if (rightNow.after(secondDate) && rightNow.before(endOfSecondDate)) {
        untilNextDate = endOfSecondDate;

    } else if (rightNow.after(endOfSecondDate) && rightNow.before(thirdDate)) {
        untilNextDate = thirdDate;

    }
    long rightNowMilli = rightNow.getTime();
    long untilNextDateMilli = untilNextDate.getTime();
    long millisUntilFinished = untilNextDateMilli - rightNowMilli;
    final Date temp = untilNextDate;
    final long secondsInMilli = 1000;
    final long minutesInMilli = secondsInMilli * 60;
    final long hoursInMilli = minutesInMilli * 60;
    final long daysInMilli = hoursInMilli * 24;
    final CountDownTimer cdt = new CountDownTimer(millisUntilFinished, 1000) {
        @Override
        public void onTick(long millisUntilFinished) {

            final long elapsedDays = millisUntilFinished / daysInMilli;
            millisUntilFinished = millisUntilFinished % daysInMilli;

            final long elapsedHours = millisUntilFinished / hoursInMilli;
            millisUntilFinished = millisUntilFinished % hoursInMilli;

            final long elapsedMinutes = millisUntilFinished / minutesInMilli;
            millisUntilFinished = millisUntilFinished % minutesInMilli;

            final long elapsedSeconds = millisUntilFinished / secondsInMilli;

            countDownTextView.setText(elapsedDays + " days " + elapsedHours + " hours " + elapsedMinutes + " minutes " + elapsedSeconds + " seconds");


        }
        @Override
        public void onFinish() {
            Intent intent = getIntent();
            finish();
            startActivity(intent);
        }
    };cdt.start();

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Проблема была связана с блоком try catch внутри метода onCreate(). Я также создал другой класс, расширяющий CountDownTimer, и заставил setText внутри onTick работать в новом потоке, теперь он работает.

0 голосов
/ 01 мая 2018
new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
//write your code
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {

         mTextField.setText("done!");
     }
  }.start();
...