0

こんにちは、私はアンドロイドプログラミングの初心者です。私の問題は、音が重ならないように、配列のサイズに応じて、次のループを何度も繰り返す前に遅延を作りたいということです。

これが私のコードです:

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 < 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 に答える