【问题标题】:Handler postDelayed only executes 1 once inside a loop处理程序 postDelayed 仅在循环内执行 1 一次
【发布时间】:2015-05-12 12:01:03
【问题描述】:

我是 android 编程新手。我在 postDelayed 中有一个问题,即使我要调用的值大于 1,延迟也只会在循环内执行一次。

这是我的代码

protected void managerOfSound() {

    int size = tempq.size();

    for (int i = 0; i < tempq.size(); i++) {
        String u =tempq.get(i);



    //WHOLE
        if (u.equals("a4")){
            mp = MediaPlayer.create(this, R.raw.a4);


      handler.postDelayed(new Runnable(){
               @Override
               public void run() {  
                   mp.start();
               }            
            },2000);

      }else if (u.equals("b4")){
            mp = MediaPlayer.create(this, R.raw.b4);

       handler.postDelayed(new Runnable(){
               @Override
               public void run() {  
                   mp.start();
               }            
            },2000);
       }
   }
}

例如

在播放媒体播放器之前,我希望延迟 2 秒,然后再延迟 2 秒,依此类推,具体取决于我要调用的值的数量……例如,值是 a4、a4 和 a4。每次调用这些值时,我都希望延迟 2 秒。有没有人可以帮助mo解决这个问题?提前致谢! :)

【问题讨论】:

  • 循环几乎是瞬间执行的。所有声音都立即排队。将 }, 2000 更改为 }, (i+1) * 2000 应该可以解决它(比如将第一个声音延迟 2 秒,将第二个声音延迟 4 秒等)。
  • 谢谢。我试过了,但它不起作用。
  • 您应该使用SoundPool 而不是MediaPlayer 来播放短音。请仔细阅读本文,我已经可以告诉您,您不会多次致电new SoundPool

标签: android handler postdelayed


【解决方案1】:

您的问题是您在 for 循环内运行 postDelayed。您确实同时运行了 n 次处理程序。您同时启动所有这些(因为完成 foor 循环所需的时间不到一毫)。你应该 在时间量上加上counter。像

handler.postDelayed(new Runnable(){
           @Override
           public void run() {  
               mp.start();
           }            
        },countr += 2000);

【讨论】:

  • 它不起作用,因为您使用 MediaPlayer 的方式...您的代码中有很多错误...首先尝试使用一些虚拟 int 变量而不是 mp 我的代码,您将能够看看循环是否像你想要的那样运行......
【解决方案2】:

这是一个可运行的带延迟计时器的工作示例。

public Runnable timedTask = new Runnable()
{

    @Override
    public void run()
    {
        // type code here which will loop with the given delay



        //if you want to end the runnable type this in the condition
        if(condition) {

        handler.removeCallbacks(this);
        return;

         }



        //delay for the runnable
        handler.postDelayed(timedTask, 2000);
    }
};

您可以在任何地方通过键入以下内容调用此方法:

handler.post(timedTask);

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2012-04-15
    相关资源
    最近更新 更多