2012-03-29 2 views
0

Я получаю отчет об исключении нулевого указателя в консоли разработчика Android. Мне нужно некоторые рекомендации относительно того, что, возможно, проблема здесь, трассировки стека, как этоAndroid TextToSpeech app null Указатель исключения

java.lang.NullPointerException 
at com.myfreeapp.workers.Speaker.onInit(Speaker.java:57) 
at android.speech.tts.TextToSpeech$1.onServiceConnected(TextToSpeech.java:451) 
at android.app.ActivityThread$PackageInfo$ServiceDispatcher.doConnected(ActivityThread.java:1247) 
at android.app.ActivityThread$PackageInfo$ServiceDispatcher$RunConnection.run(ActivityThread.java:1264) 
at android.os.Handler.handleCallback(Handler.java:587) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4668) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 
at dalvik.system.NativeStart.main(Native Method) 

Соответствующий фрагмент кода в мое приложение является

public Speaker(final Context context, final Settings settings) 
{ 
    this.settings = settings; 
    params = new HashMap<String, String>();  
    params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "myfreeapps"); 

    tts= new TextToSpeech(context, this); 
    Utils.log(TAG, "Created TextToSpeech.."); 
} 

@Override 
public void onInit(final int status) 
{ 
    Utils.log(TAG, "TTS onInit.."); 

//below is line 57 mentioned in the stack trace 
    tts.setOnUtteranceCompletedListener(new SpeechFinishedListener()); 
    tts.setLanguage(Locale.getDefault()); 
    tts.setSpeechRate(settings.getSpeed()); 
    tts.setPitch(settings.getPitch());  
    ready = true; 

} 

Пожалуйста, прежде всего я должен быть ясно что именно равно null .. Является ли трассировка стека указателем на переменную tts в строке 57 равную null ..?

Или исключение нулевого указателя происходит внутри метода TextToSpeech setOnUtteranceCompletedListener?

экземпляр

Спикер создается на основном потоке в липкую службы, и когда я отлаживать код обратного вызова из TextToSpeech также возвращается в том же потоке ..

Я не понимаю, как мог переменная tts be null ???

Кстати, эта проблема не воспроизводится на моем конце. Я уже несколько раз рассказывал об этом стэке стеки на консоли разработчика.

Пожалуйста, посоветуйте,

+0

Является ли их причина вы инициализация вашего объекта TextToSpeech в конструктор против ins ide onInit? – HandlerExploit

+0

Ну, onInit вызывается в результате создания TextToSpeech (контекст, это); второй параметр для конструктора TextToSpeech - это реализация OnInitListener, у которого есть метод onInit .. Класс речи реализует интерфейс OnInitListener. – Ahmed

ответ

1

Я решил эту проблему, вот как это работает

был СА se, где я создавал объект Speaker на не-ui-потоке. Обратный вызов в OnInit() придет на UI нить/основной поток ..

Теперь, даже если запустить его, возможно, не всегда врезаться, но я понял, что это было не безопасно, и шансы нулевые исключения указателей есть ..

поэтому мой обновленный код выглядит следующим образом

public Speaker(final Context context, final Settings settings) 
{ 
    this.settings = settings; 
    params = new HashMap<String, String>();  
    params.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_ALARM)); 
    params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "myfreeapps"); 

    synchronize(synchobject) 
    { 
     tts= new TextToSpeech(context, this); 
    } 
    Utils.log(TAG, "Created TextToSpeech.."); 
} 

@Override 
public void onInit(final int status) 
{ 
    Utils.log(TAG, "TTS onInit.."); 

    synchronize(synchobject) 
    { 

    tts.setOnUtteranceCompletedListener(new SpeechFinishedListener()); 
    tts.setLanguage(Locale.getDefault()); 
    tts.setSpeechRate(settings.getSpeed()); 
    tts.setPitch(settings.getPitch());  
    ready = true; 
    } 

} 

Это, кажется, решить мою проблему, спасибо каждому за ваш вклад, чтобы помочь мне, ..

0

Возможно, TextToSpeech двигатель не установлен на устройстве.

+0

Я исследовал код TextToSpeech третьей линии трассировки. в android.speech.tts.TextToSpeech $ 1.onServiceConnected (TextToSpeech.java:451). OnInit вызывается с кодом УСПЕХА – Ahmed

0

Правильно ли я полагаю, что Speaker - это класс, который вызывается извне вашего основного вида деятельности?

Кажется, что метод onInit вызывается перед конструктором. Я вижу, вы проверили это с помощью тегов журнала; Каков был ваш результат?

+0

Экземпляр динамика создается в службе onStartCommand (..). У меня есть только трассировка стека, доступная с консоли разработчика Android. Я думал, что невозможно, чтобы onInit() можно было вызвать до конструктора? – Ahmed

+0

У меня было такое же впечатление, что onInit никогда не следует вызывать перед конструктором. При устранении неполадок никогда не мешает дважды проверить реализацию. – AnthonyW

2

Ваш код должен работать, но я хотел бы попробовать это, чтобы увидеть, если он исправляет эту проблему:

в верхней части кода поставить это:

Handler handler = new Handler() 

затем сделать свой другой код есть это :

handler.post(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      tts.setOnUtteranceCompletedListener(new SpeechFinishedListener()); 
      tts.setLanguage(Locale.getDefault()); 
      tts.setSpeechRate(settings.getSpeed()); 
      tts.setPitch(settings.getPitch());      
     } 
    }); 
+0

Спасибо, я бы попробовал, и я хотел бы понять эту штуку. Это что-то вроде публикации в очереди потоков пользовательского интерфейса, которая будет вызвана позже? Как invokeLater of swing? – Ahmed

Смежные вопросы