Как отложить действие внутри цикла for, прежде чем снова продолжить следующий цикл

Привет, я новичок в программировании для 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, но результат такой же.

Есть ли кто-нибудь, кто может предложить и помочь мне с моей проблемой? Пожалуйста. Работаю неделю. Заранее спасибо.


person ALD    schedule 12.03.2015    source источник
comment
создайте новый поток и используйте сон, не используйте основной поток   -  person Xcihnegn    schedule 12.03.2015
comment
НИКОГДА не используйте Sleep на любом языке программирования или на любой платформе — это зло, особенно когда речь идет об Android.   -  person Squonk    schedule 12.03.2015
comment
Я уже пробовал, но все равно. я не могу нажать кнопку для остановки.   -  person ALD    schedule 12.03.2015
comment
другие предложили мне использовать postDelayed, но он не задерживает снова после того, как задержался в первый раз.   -  person ALD    schedule 12.03.2015
comment
@ALD: правильный способ сделать то, что вы хотите, т. е. дождаться завершения каждого звука в последовательности звуков, — это использовать прослушиватель OnCompletion(..) класса MediaPlayer. Не используйте цикл for, просто используйте int, который запускает каждый звук, и в обратном вызове onCompletion(...) увеличьте int (если это не ›= верхнего диапазона), а затем сделайте то, что необходимо, чтобы начать MediaPlayer со следующим звуком (на основе значения int).   -  person Squonk    schedule 12.03.2015


Ответы (2)


Попробуйте этот код:

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


                }
            }
person Pratik Popat    schedule 12.03.2015
comment
спасибо, я попробовал, и это сработало, но что, если у меня есть набор случайных массивов, таких как, например, a4, a4, c4, b4, a4, b4 в зависимости от пользовательского ввода. - person ALD; 12.03.2015

Пожалуйста, используйте это

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

Средства Поместите все ваши условия только в один обработчик и каждый раз инициализируйте обработчик. Это правильно работает на моем конце.

person EminenT    schedule 12.03.2015
comment
Благодарю. я попробовал это, но он не задерживается после первой задержки. - person ALD; 12.03.2015