Похоже, вы хороните ключевые ссылки внутри анонимных внутренних классов, и я не понимаю, как вы можете получить к ним доступ, когда и при необходимости.Зачем это делать?Почему бы не создать экземпляр неанонимного класса, класса с полем AdvancedPlayer, класса, ссылка на который хранится в некоторой коллекции, например, List<...>
или HashMap, или переменной, если выполняется только один или два, где выможет извлечь объект, получить его поле AdvancedPlayer и вызвать на нем .stop()
?
например,
public class RunnablePlayer implements Runnable {
private AdvancedPlayer player;
private String text;
private boolean voiceEnabled;
public RunnablePlayer(String text, boolean voiceEnabled) {
this.text = text;
this.voiceEnabled = voiceEnabled;
}
@Override
public void run() {
try {
// Create a JLayer instance
player = new AdvancedPlayer(synthesizer.getMP3Data(text));
if (voiceEnabled) {
player.play(); //Plays the TTS audio
System.out.println("Successfully retrieved synthesizer data");
}
} catch (IOException | JavaLayerException e) {
e.printStackTrace();
}
}
public AdvancedPlayer getPlayer() {
return player;
}
public void stop() {
// perhaps do a null check here first?
if (player != null) {
player.stop();
}
}
}
Тогда у вас может быть поле класса, что-то вроде:
// field of the class
private RunnablePlayer runnablePlayer;
и используйте это в своем методе разговора:
public void talk(String text, boolean voiceEnabled) {
if (runnablePlayer != null) {
runnablePlayer.stop(); // not calling this on a Thread
}
runnablePlayer = new RunnablePlayer(text, voiceEnabled);
Thread thread = new Thread(runnablePlayer);
//.....
thread.start();
}
Код не скомпилирован или не протестирован, но представлен только для того, чтобы дать общее представление.