Привет, я новичок в программировании для 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, но результат такой же.
Есть ли кто-нибудь, кто может предложить и помочь мне с моей проблемой? Пожалуйста. Работаю неделю. Заранее спасибо.
Sleep
на любом языке программирования или на любой платформе — это зло, особенно когда речь идет об Android. - person Squonk   schedule 12.03.2015OnCompletion(..)
классаMediaPlayer
. Не используйте циклfor
, просто используйте int, который запускает каждый звук, и в обратном вызовеonCompletion(...)
увеличьте int (если это не ›= верхнего диапазона), а затем сделайте то, что необходимо, чтобы начатьMediaPlayer
со следующим звуком (на основе значения int). - person Squonk   schedule 12.03.2015