Executar Loop em Thread (Android Java)

30/11/2022

0

Preciso executar pequenos loops de música em tempos determinados. Eu consigo executar com o código abaixo, fazendo um loop em um array que tem todos os loops de música, porém o Thread.sleep não deveria estar dentro de runOnUiThread e isso que está bloqueando a Interface do usuário (IU), sendo que se eu colocar fora dele, funciona normal, que é o correto, mas não teria como eu executar os sons em loop, executando um e parando, depois executando outro e assim por diante, até finalizar. Alguém saberia como resolver esse problema?
Thread.sleep precisa estar dentro de um loop, pois ele toca cada som em um tempo determinado, conforme mostra o código abaixo.

public class MainActivity extends AppCompatActivity {
    
        private List<Music> list;
        private SoundPool soundPool;
        private int sound1, sound2, sound3, sound4, sound5;
         
         @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main); 
        
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_GAME)
                    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                    .build();

            soundPool = new SoundPool.Builder().setMaxStreams(10)
                    .setAudioAttributes(audioAttributes).build();
        }
        else {
            soundPool = new SoundPool(6, AudioManager.STREAM_MUSIC, 3);
        }

sound1 = soundPool.load(this, R.raw.sound1, 1);
sound2 = soundPool.load(this, R.raw.sound2, 1);
sound3 = soundPool.load(this, R.raw.sound3, 1);
sound4 = soundPool.load(this, R.raw.sound4, 1);
sound5 = soundPool.load(this, R.raw.sound5, 1);
        
        list = new ArrayList<Music>();
        list.add(new Music(sound1, 2000));
        list.add(new Music(sound2, 2000));
        list.add(new Music(sound3, 4000));

        list.add(new Music(sound4, 2000));
        list.add(new Music(sound5, 2000));
        list.add(new Music(sound2, 2000));
        list.add(new Music(sound1, 2000));
        list.add(new Music(sound3, 4000));
        list.add(new Music(sound1, 4000));
        
    }

public void startMusic(View v) {
        
        new Thread(new Runnable() {
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        for (int i = 0; i < list.size(); i++) {
                                soundPool.play(((Music) list.get(i)).getId(), 3, 3, 1, 0, 1);                            
                            try {
                                Thread.sleep(((Music) list.get(i)).getTempo());
                                soundPool.autoPause();
                                soundPool.stop(((Music) list.get(i)).getId());
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });

            }
        }).start();
    }
}
Marcos Arantes

Marcos Arantes

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar