Handler.postdelayed

时间:2011-05-16 18:20:08

标签: android

我正在使用handler.postDelayed方法为某些动画内容创建一些延迟。

我正在使用Mediaplayer播放一些歌曲。用户可以通过单击下一步退出此操作类。但是在下一个屏幕上,即使我在下一个按钮的onclicklistener中调用了stop方法,同一首歌也在继续。

是否由于添加的时间延迟导致在下一个活动加载后执行。有什么想法吗?

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

2 个答案:

答案 0 :(得分:2)

您是否添加Log以查看run()是否被调用?我假设您的处理程序未注册;毕竟,postDelayed会等到弯针重新开始。

我认为你的动画比2000ms更快?在您的活动消失后,您将无法调用您的处理程序,它正在访问我imageView1中我认为已销毁的onDestroy

您可以考虑添加一个标志,强制在onDestroy中立即调用该操作,和/或您可以使用Timer。如果是计时器,请确保在销毁之后不要使用imageView1之类的内容。

答案 1 :(得分:0)

使用线程。然后中断停止它:

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();
   }
 }

希望我有所帮助。