Вы можете заключить свой транскрипт массива в класс, который имеет свой собственный обработчик или приемник (способ обработки асинхронных запросов).
Примерно так:
import java.util.function.Consumer;
public class ArrayWrapper {
private Consumer consumer;
private Object [] array;
public ArrayWrapper(int size) {
this.array = new Object [size];
}
public void addConsumer(Consumer consumer) {
this.consumer = consumer;
}
public void add(Object o, int index) {
array[index] = o;
consumer.accept(o);
}
public Object [] get() {
return array;
}
}
Тогда вы можетепросто реализуйте свою логику внутри Consumer:
ArrayWrapper transcript = new ArrayWrapper(1);
transcript.addConsumer(new Consumer() {
@Override
public void accept(Object o) {
// perform your operations
System.out.println(o);
}
});
service.recognizeUsingWebSocket(options, new BaseRecognizeCallback() {
@Override
public void onTranscription(SpeechRecognitionResults speechResults) {
for(int i = 0; i < speechResults.getResults().size(); i++){
String newTranscript = transcript.get()[0] + speechResults.getResults().get(i).getAlternatives().get(0).getTranscript() + "\n";
transcript.add(newTranscript, 0);
}
}
});
Это всего лишь пример, но идея в том, что вам нужно либо использовать функцию внутри обратного вызова, какой-то сигнал, чтобы сообщить вам, когда цикл выполнен внутри обратного вызова, или что-то ещеаналогично.
Редактировать:
Или вы можете сделать это более простым способом (без каких-либо дополнительных классов):
final String[] transcript = {""};
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
//your operations
System.out.println(s);
}
};
service.recognizeUsingWebSocket(options, new BaseRecognizeCallback() {
@Override
public void onTranscription(SpeechRecognitionResults speechResults) {
for(int i = 0; i < speechResults.getResults().size(); i++){
transcript[0] = transcript[0] + speechResults.getResults().get(i).getAlternatives().get(0).getTranscript() + "\n";
consumer.accept(transcript[0]);
}
}
});
}