0

嗨,我是 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 语句之外,但结果是一样的。

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

4

2 回答 2

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

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

于 2015-03-12T08:06:59.337 回答
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);


                }
            }
于 2015-03-12T08:10:00.520 回答