2015-03-12 3 views
0

Привет, я новичок в программировании для Android. Моя проблема в том, что я хочу сделать задержку перед продолжением следующего цикла снова и снова в зависимости от размера моего массива, чтобы звуки не перекрывались.Как задержать действие внутри цикла for перед продолжением следующего цикла заново

Вот мой код:

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 (я + 1) * 4000, как то, что другие предложили, но до сих пор ее не работает. И я также пробовал укладывать задержку за пределами if if else, но результат такой же.

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

+0

создать новую нить и использовать сон, не используйте основной поток – Xcihnegn

+1

НИКОГДА не используйте 'Sleep' на любом языке программирования или на любой платформе - это зло - особенно, когда речь идет о для Android. – Squonk

+0

Я уже пробовал, но все равно. Я не могу нажать кнопку для остановки. – ALD

ответ

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


       } 
      } 
+0

спасибо, я попробовал, и это сработало, но что, если у меня есть набор случайных массивов, например, a4, a4, c4, b4, a4, b4 в зависимости от ввода пользователя. – ALD

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

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

+0

спасибо. он его не задерживал после его первой задержки. – ALD

 Смежные вопросы

  • Нет связанных вопросов^_^