Обработчик.postdelayed

#android

#Android

Вопрос:

Я использую метод handler.postDelayed, чтобы создать некоторую задержку для некоторых анимационных материалов.

При этом я также проигрываю какую-то песню с помощью Mediaplayer. Пользователь может выйти из этого класса действий, нажав далее. Но на следующем экране та же песня продолжается, хотя я вызвал метод stop в onclicklistener следующей кнопки.

Связано ли это с добавленным временем задержки, которое выполняется после загрузки следующего действия. Есть идеи?

 handler.postDelayed(new Runnable() {
        public void run() {
            mp = MediaPlayer.create(getApplicationContext(), R.raw.num2);
            mp.start();
            imageView1.setImageResource(R.drawable.countcat2);
        }
    }, 2000);
  

Ответ №1:

Вы добавили, Log чтобы посмотреть, будет ли run() вызван? Я бы предположил, что ваш обработчик становится незарегистрированным; в конце концов, postDelayed будет ждать, пока циклизатор снова не запустится.

Я предполагаю, что ваша анимация быстрее, чем эти 2000 мс? Вы все равно не сможете вызвать свой обработчик после того, как ваша активность прекратится, это доступ, imageView1 который, я полагаю, уничтожен в onDestroy .

Вы могли бы рассмотреть возможность добавления флага, который принудительно вызовет операцию немедленно в onDestroy , и / или вы могли бы использовать Timer . В случае таймера убедитесь, что не используете что-то вроде imageView1 после того, как он был уничтожен.

Комментарии:

1. ого! флаг был таким простым. Я смущен. Спасибо 🙂

Ответ №2:

Используйте потоки. А затем остановите его прерыванием:

 Public Thread getThread(final Handler handle, int delay)
{
  return new Thread() 
  {
    @Override
    public void run() 
    {
      try
      {
         synchronized(this) 
         {
           Thread.sleep(delay);     
           handle.post(new Runnable() 
           {    
             @Override
             public void run() 
             {      
               "the code to be exec."
             }
           });

         }    
     }
       catch(Exception e)
       {
    e.printStackTrace();
       }
    };
  };
}
  

Или вы можете использовать функцию postDelayed

 Public Thread getThread(final Handler handle, int delay)
{
  return new Thread() 
  {
    @Override
    public void run() 
    {
      try
      {
         synchronized(this) 
         {  
           handle.postDelayed(new Runnable() 
           {    
             @Override
             public void run() 
             {      
               "the code to be exec."
             }
           }, delay);

         }    
     }
       catch(Exception e)
       {
    e.printStackTrace();
       }
    };
  };
}
  

вы обнаружите, что между этими двумя методами есть небольшая разница. Чтобы прервать его, сделайте что-то вроде этого:

   Thread t = getThread(handle, delay);
  t.start();
  if(t != null)
  {
   if (t.isAlive())
   {
     t.interrupt();
   }
 }
  

Надеюсь, я помог.