2011-05-16 54 views
3

我正在使用handler.postDelayed方法为某些动画内容创建一些延迟。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

你加一个Log,看是否run()被调用?我会假设你的处理程序被取消注册;毕竟,postDelayed将等待,直到再次踢人。

我假设你的动画比那2000ms更快?在你的活动结束后,你将无法让你的处理程序调用,它正在访问imageView1,我认为它在onDestroy中被销毁。

你可以考虑增加一个标志,该标志将强制执行该操作将在onDestroy立即打电话,和/或你可以使用一个Timer。在定时器的情况下,请确保在销毁后不要使用类似imageView1的东西。

+0

doh!国旗很简单。我很尴尬。谢谢 :) – nasaa 2011-05-16 18:52:50

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

希望我帮了忙。

相关问题