如何在继续下一次循环之前延迟for循环中的操作

时间:2015-03-12 07:55:44

标签: android multithreading postdelayed

嗨,我是Android编程的新手。我的问题是我希望在继续下一个循环之前做一个延迟,这取决于我的数组的大小,以便声音不会重叠。

这是我的代码:

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);
            mp.start();


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


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


        }
    }
}

我尝试使用Thread.sleep,但我需要停止使用按钮单击播放声音,但由于Thread.sleep我无法单击按钮,所以我不得不忽略使用它。但是这是我的代码,以防万一有人有解决方案。我已经尝试过Thread.currentThread.interrupt,但是当我使用它时,我的声音再次重叠。

使用Thread.sleep的代码:

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);
            mp.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ie) {
                // TODO Auto-generated catch block

            }

        }else if (u.equals("b4")){
            mp = MediaPlayer.create(this, R.raw.b4);
            mp.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ie) {
                // TODO Auto-generated catch block

            }

        }else if (u.equals("c4")){
            mp = MediaPlayer.create(this, R.raw.c4);
            mp.start();
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ie) {
                // TODO Auto-generated catch block

            }

        }
    }
}

我尝试的另一种方法是postDelayed但似乎在第一次循环后它没有延迟。

这是我的postDelayed代码:

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

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

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

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

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

我也试过改变,4000到(i + 1)* 4000和其他人的建议一样,但仍然无法正常工作。而且我也尝试将延迟放在if else语句之外,但结果是一样的。

是否有人可以建议并帮助解决我的问题?请。我已经工作了一个星期。提前致谢。

2 个答案:

答案 0 :(得分:1)

请使用此

  for (int i = 0; i < 4; i++) {
            String u = " q";

            handler = new Handler();
            handler.postDelayed(new Runnable(){
                @Override
                public void run() {  
                   Toast.makeText(getApplicationContext(), "i" , Toast.LENGTH_SHORT).show();
                }            
             },4000);
}

意味着每次只将所有条件放在一个处理程序中并初始化处理程序。这在我的最后正常工作。

答案 1 :(得分:1)

试试这段代码:

 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);
                    mp.start();


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


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


                }
            }