Android CountDownTimer не отображается должным образом

У меня есть простой таймер обратного отсчета Android, вывод которого искажен. Я пытаюсь создать простую игру, в которой пользователь должен повторно нажимать кнопку, которая, в свою очередь, меняет рисуемое изображение с одного на другое через курс из 8 изображений. Drawables отображаются нормально, но таймер обратного отсчета (который должен быть от 30 секунд вниз), кажется, застревает и / или генерирует неправильные числа, которые не представляют текущее количество прошедшего времени. Есть ли у кого-нибудь какие-либо советы о том, почему это происходит или что я должен исследовать, чтобы исправить эту проблему?

MultitapGame.java

    public class MultitapGame extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.multitapgame);

    final View btn = findViewById(R.id.gameButton);
    final View img = findViewById(R.id.game1);

    final TextView mTextField = (TextView) findViewById(R.id.gameCDT);
    final TextView mTextField2 = (TextView) findViewById(R.id.gameCDT2);
    final View mTextField3 = findViewById(R.id.gameCDT3);
    final View mTextField4 = findViewById(R.id.gameCDT4);


    img.setBackgroundResource(R.drawable.image1);

        btn.setOnClickListener(new OnClickListener() {

            public int count = 0;


        @Override
        public void onClick(View v) {

            setCount(getCount() + 1);
            new CountDownTimer(30000, 1000) {

                 public void onTick(long millisUntilFinished) {

                     int timeLeft =  (int) (millisUntilFinished / 1000) ;

                     ((TextView) mTextField).setText("seconds remaining: ");
                     final TextView mTextField2 = (TextView) findViewById(R.id.gameCDT2);
                        mTextField2.setText(String.valueOf(timeLeft + ""));

                 }

                 public void onFinish() {

                     int numTaps = count;
                     if(numTaps<150)
                     {
                         ((TextView) mTextField3).setText("Unlucky chucky! ");
                         ((TextView) mTextField4).setText("taps done: " + numTaps);
                     }
                     else
                     {
                         ((TextView) mTextField3).setText("Congrats Bro :-) !");
                         ((TextView) mTextField4).setText("taps done: " + numTaps);
                     }
                 }
              }.start();


            if(count==15)
            {
            img.setBackgroundResource(R.drawable.image2);}
            if(count==30)
            {
            img.setBackgroundResource(R.drawable.image3);}
            if(count==45)
            {
            img.setBackgroundResource(R.drawable.image4);}
            if(count==60)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==75)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==90)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==100)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==110)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==115)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==118)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==121)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==123)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==125)
            {
            img.setBackgroundResource(R.drawable.image6);}
            if(count==126)
            {
            img.setBackgroundResource(R.drawable.image5);}
            if(count==127)
            {
            img.setBackgroundResource(R.drawable.image6);}

            if(count==130)
            {
            img.setBackgroundResource(R.drawable.image7);}
            if(count==140)
            {
            img.setBackgroundResource(R.drawable.image1);}
            if(count==160)
            {
                Intent i = new Intent();
                i.setClassName("com.B00512756.angertwo",
                        "com.B00512756.angertwo.Strategies");
                startActivity(i);
                finish();}

        }


        public int getCount() {
            return count;
        }


        public void setCount(int count) {
            this.count = count;
        }
        });
}

}


person Richy    schedule 09.07.2012    source источник
comment
Выполняется ли метод onTick() внутри потока пользовательского интерфейса? Если нет, то вам следует использовать обработчик или другой метод для обновления пользовательского интерфейса из потока пользовательского интерфейса.   -  person Andrew Mackenzie    schedule 08.02.2013


Ответы (1)


Я думаю, что проблема связана с реализацией CountDownTimer внутри вашего метода onClick.

Я бы предложил реализовать его как подкласс, который расширяет CountDownTimer, например:

public class MyCounter extends CountDownTimer{

        public MyCounter(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

                 @Override
                 public void onTick(long millisUntilFinished) {

                     mTextField.setText("seconds remaining: ");
                     mTextField2.setText(String.valueOf((int) (millisUntilFinished/1000) + ""));

                 }

                 @Override
                 public void onFinish() {

                     int numTaps = count;
                     if(numTaps<150)
                     {
                         mTextField3.setText("Unlucky chucky! ");
                         mTextField4.setText("taps done: " + numTaps);
                     }
                     else
                     {
                         mTextField3.setText("Congrats Bro :-) !");
                         mTextField4.setText("taps done: " + numTaps);
                     }
                 }

    }

Кроме того, лучше сделать код внутри onTick() как можно короче, потому что вызовы onTick(long) синхронизируются с этим объектом. Таким образом, один вызов onTick(long) никогда не произойдет до завершения предыдущего обратного вызова. Это имеет значение только тогда, когда реализация onTick(long) требует времени для выполнения, которое значительно по сравнению с интервалом обратного отсчета. Таким образом, если для выполнения кода onTick() требуется больше секунды, у вас будут задержки в обратном отсчете. Поэтому я сделал его короче.

Лучше инициализировать ваши TextView внутри вашего onCreate() и объявить их как общедоступные переменные класса, чтобы вам не приходилось делать это каждый раз, когда ваш счетчик тикает или заканчивается.

Следующий шаг — инициализировать ваш таймер в onCreate:

final MyCounter timer = new MyCounter(30000,1000);

Наконец, вам нужно запустить его в вашем методе onClick():

timer.start();
person Erol    schedule 09.07.2012