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