@Deni_Martins escreveu:
problemas ao iterar em uma AsyncTask com Timer e TimerTask
olá pessoal, estou tentando desenvolver um aplicativo de metronomo e tenho a seguinte situação:
eu tenho uma classe Play que extende a classe AsyncTask, esta classe Play possui um objeto Timer e possui uma subclasse que extende TimerTask
O problema ocorre depois de instanciar um objeto da classe Play e chamar o metodo execute passando uma musica como argumento "play.execute(music);"
Essa musica é recebida no método doInBackground, porém percebi que após ser executado o método timer.scheduleAtFixedRate(new Play.Click(),0,interval); o metodo doInBackground continuava a ser executado, continuando a incrementar minha variavel i, que estou usando para pegar a posição de cada compasso da musica, causando erro de nullPointerException
Imaginei que deveria parar a thread na classe Play enquanto a execução estivesse dentro da instrução for para iterar por todos os compassos da musica.
Então criei um objeto para controlar a pausa da thread na classe Play e sincronizar quando a execução estivesse dentro da subclasse Click, mas também não funcionou, após chamar o método wait() a execução na classe Play continua por mais vezes até a execução ir para a classe Click, mas neste ponto minha variável incrementadora i já possui um valor alto e acabo tendo erro de acessar index não existente na primeira instrução for na subclasse Click, o mesmo acontece com a segunda instrução for nesta subclasse, onde percorro por cada tempo do compasso atual, se na primeira instrução for eu definir o valor do metodo get para 0 invés da variável i
aceito sugestções de alterações no código ou outras abordagens que eu deveria tomar
Atenciosamente desde já
Grato
public class Play extends AsyncTask<Musica,Void,Void>{ private Context context; private PlayContract.Actions pa; private long intervalo; Musica musica; public int i; Timer timer = new Timer(); public int tempoatual; MediaPlayer clickForte; MediaPlayer clickFraco; public Object pauseLock; private boolean paused; private boolean finished; public Play(Context context, PlayContract.Actions pa) { this.context = context; this.pa = pa; clickForte = MediaPlayer.create(context, R.raw.clickforte); clickFraco = MediaPlayer.create(context, R.raw.clickfraco); pauseLock = new Object(); paused = false; finished = false; } @Override protected Void doInBackground(Musica... params) { musica = params[0]; while (!finished){ for (i = 0; i < musica.getCompassos().size(); i++){ intervalo = (long)musica.getCompassos().get(i).getIntervalo(); timer.scheduleAtFixedRate(new Play.Click(),0,intervalo); paused = true; synchronized (pauseLock){ while (paused){ try { pauseLock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } finished = true; } return null; } public class Click extends TimerTask{ @Override public void run() { for (int j = 0; j < musica.getCompassos().get(i).getRepeticoes(); j++){ for (tempoatual = 0; tempoatual <= musica.getCompassos().get(i).getTempos(); tempoatual++){ if (tempoatual == 0){ tempoatual += 1; } if (tempoatual == 1){ clickStrong(); } else { clickWeak(); } } } synchronized (pauseLock){ paused = false; pauseLock.notifyAll(); } } } public void cancel() { timer.cancel(); } public void clickStrong() { clickFraco.start(); } public void clickWeak() { clickForte.start(); } }
Mensagens: 1
Participantes: 1