Einschließen des Funktionsaufrufs mit seinem Rückruf in einer Blockierungsfunktion in Java (Android-spezifisch)Android

Forum für diejenigen, die für Android programmieren
Guest
 Einschließen des Funktionsaufrufs mit seinem Rückruf in einer Blockierungsfunktion in Java (Android-spezifisch)

Post by Guest »

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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post