Einschließen des Funktionsaufrufs mit seinem Rückruf in einer Blockierungsfunktion in Java (Android-spezifisch)
Posted: 16 Jan 2025, 11:44
Im Android-System gibt es eine TextToSpeech-API, die die Initialisierung der TTS-Engine ermöglicht. Dies geschieht durch Aufrufen des TextToSpeech-Konstruktors und Übergeben eines später aufgerufenen Listeners mit dem Ergebnis:
Was ich erreichen möchte, ist eine Blockierungsfunktion, die den Konstruktor aufruft und nach Abschluss des Rückrufs zurückkehrt.
Wie ich erfahren habe, wird der Listener unabhängig von dem Thread, aus dem der Konstruktor aufgerufen wird, vom Thread der „Hauptanwendung“ ausgelöst.
Meine Idee war, eine Beispielfunktion zu haben (vereinfachter Code - Ich hoffe es ist verständlich):
Ich habe gehofft, dass der Listener auch in einem neuen Thread aufgerufen wird, aber da er im Hauptthread aufgerufen wird und der Hauptthread wartet ( cdl.await() ) Es wird nie aufgerufen und die gesamte Anwendung bleibt hängen.
Haben Sie eine Idee, wie ich in dieser Situation mein Ziel erreichen kann? Vielleicht mache ich etwas grundsätzlich falsch?
Code: Select all
mEngine = new TextToSpeech(mContext, listener, ENGINE_GOOGLE_NAME);
Wie ich erfahren habe, wird der Listener unabhängig von dem Thread, aus dem der Konstruktor aufgerufen wird, vom Thread der „Hauptanwendung“ ausgelöst.
Meine Idee war, eine Beispielfunktion zu haben (vereinfachter Code - Ich hoffe es ist verständlich):
Code: Select all
private TextToSpeech mEngine;
CountDownLatch cdl = new CountDownLatch(1);
ExecutorService executorService = Executors.newSingleThreadExecutor();
public void initializeBlocking() {
executorService.execute(() -> { // new thread
mEngine = new TextToSpeech(mContext, status -> {
cdl.countDown(); // callback body (executes in "main" thread)
}, ENGINE_GOOGLE_NAME);
});
cdl.await(); // main thread
}
Haben Sie eine Idee, wie ich in dieser Situation mein Ziel erreichen kann? Vielleicht mache ich etwas grundsätzlich falsch?