Ошибка в обратном отсчете времени в Android? - PullRequest
0 голосов
/ 20 марта 2012

Я работаю над макетом, который показывает вкладку в виде структуры в нижней части макета.Что мне нужно показать по двойному нажатию, а затем скрыть его через 5 секунд.Поэтому я использую этот таймер обратного отсчета:

public void timer()
{
     cdt=new CountDownTimer(5000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {

            System.out.println("Timer Working"+millisUntilFinished+"");

        }

        @Override
        public void onFinish() {

            System.out.println("Finished");
            main =(LinearLayout)findViewById(R.id.parent);

            ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams)main.getLayoutParams();
            mlp.height=420;

            set_up_views();
            find_module();
            tl.setVisibility(View.INVISIBLE);


        }
    }.start();

}

Но я не знаю, как остановить и перезапустить этот таймер.Как я могу это сделать?

1 Ответ

1 голос
/ 20 марта 2012

Я предлагаю вам не использовать CountDownTimer для этого случая.

Использовать Handler.postDelayed (Runnable runnable, long delay))

public class yourActivity extends Activity
{
     public Handler handler = new Handler();


     ...


     public void hideAfter5Sec()
     {
         handler.postDelayed(new Runnable()
         {
             View view = findViewById(view_to_hide);
             view.setVisibility(View.INVISIBLE);
         }, 5000);

     } 
}

postDelayed выполнит этокод после 5Sec.

РЕДАКТИРОВАНИЕ:

postDelayed будет вызываться только один раз через 5 секунд через Lopper.loop ().Если есть многократный вызов hideAfter5Sec (), то только вы получите множественный вызов postDelayed.

Если у вас множественный вызов hideAfter5Sec (), я не думаю, что есть какая-то ошибка, потому что hideAfter5Sec () просто скрывает это.так что если это один или несколько, ваш вид будет скрыт.

Если в случае, если вы хотите скрыть только в последнем вызове hideAfter5Sec (), используйте этот вариант.

public class yourActivity extends Activity
{
     public Handler handler = new Handler();
     public long lastHideAfter5Sec = 0L;

     ...


     public void hideAfter5Sec()
     {
         lastHideAfter5Sec = System.currentTimeMillis();
         handler.postDelayed(new Runnable()
         {
             if(System.currentTimeMillis() - lastHideAfter5Sec < 5000) 
                 return;
             View view = findViewById(view_to_hide);
             view.setVisibility(View.INVISIBLE);
         }, 5000);

     } 
...