gram około z funkcji TTS Android i klasy TextToSpeech ma tę metodę, aby ustawić detektor, który zostanie zgłoszony po zakończeniu odtwarzania TextToSpeech:Dlaczego program UtteranceProgressListener nie jest interfejsem?
public int setOnUtteranceCompletedListener(TextToSpeech.OnUtteranceCompletedListener listener)
Ale OnUtteranceCompletedListener
jest zdefiniowany jako public abstract class
. Ponieważ mój MainActivity
już rozszerza działanie, nie może również rozszerzać OnUtteranceCompletedListener
. Mógłbym użyć starszą metodę z OnUtteranceCompletedListener
, ale to jest przestarzałe:
public int setOnUtteranceCompletedListener (TextToSpeech.OnUtteranceCompletedListener listener)`
Dlaczego OnUtteranceCompletedListener
nie zdefiniowane jako public static interface
? Zastanawiam się napisać własne UtteranceProgressListenerImpl
, które następnie po prostu zadzwonić do metody MainActivity
s. . Czy to właściwy sposób, czy istnieje lepsza/czystsza alternatywa?
private class UtteranceProgressListenerImpl extends UtteranceProgressListener {
private MainActivity mainActivity;
UtteranceProgressListenerImpl(MainActivity mA) {
mainActivity = mA;
}
@Override
public void onDone(String utteranceId) {
mainActivity.onDone(utteranceId);
}
@Override
public void onError(String utteranceId) { /* empty */ }
@Override
public void onStart(String utteranceId) { /* empty */ }
}
Alternatywnym rozwiązaniem dla anonimowej klasy wewnętrznej jest utworzenie całkowicie oddzielnej (nieanonimowej) klasy wewnętrznej, która rozszerza kanał UtteranceProgressListener. Takie podejście przyjąłem, kiedy zmieniłem aplikację, która używała tekstu na mowę. Od tego czasu otrzymałem kilka wyjątków NoClassDefFoundError w konsoli programisty i doszedłem do wniosku, że takie podejście jest nieuzasadnione (gra słów nie jest przeznaczona). Wydaje się, że od czasu do czasu program ładujący klasy nie może załadować klasy w czasie lub w ogóle (trudno jest stwierdzić, który z nich). Więc nie przyjmuj tej trasy. – Phil