by Guest » 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:
Code: Select all
mEngine = new TextToSpeech(mContext, listener, ENGINE_GOOGLE_NAME);
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):
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
}
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?
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:
[code]mEngine = new TextToSpeech(mContext, listener, ENGINE_GOOGLE_NAME);[/code]
[b]Was ich erreichen möchte, ist eine Blockierungsfunktion, die den Konstruktor aufruft und nach Abschluss des Rückrufs zurückkehrt.[/b]
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]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
}
[/code]
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.
[b]Haben Sie eine Idee, wie ich in dieser Situation mein Ziel erreichen kann? Vielleicht mache ich etwas grundsätzlich falsch?[/b]