Problema ao iterar em AsyncTask com Timer e TimerTask

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