Исключение нулевого указателя в приложении Android TextToSpeech - PullRequest
0 голосов
/ 29 марта 2012

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

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;

}

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

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

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

Я не понимаю, как переменная tts может быть нулевой ???

Кстати, эта проблема не воспроизводится с моей стороны. У меня несколько раз сообщалось об этом стеке на консоли разработчика.

Пожалуйста, сообщите,

Ответы [ 4 ]

2 голосов
/ 30 марта 2012

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

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

handler.post(new Runnable()
    {
        @Override
        public void run()
        {
            tts.setOnUtteranceCompletedListener(new SpeechFinishedListener());
            tts.setLanguage(Locale.getDefault());
            tts.setSpeechRate(settings.getSpeed());
            tts.setPitch(settings.getPitch());                    
        }
    });
1 голос
/ 04 апреля 2012

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

Был случай, когда я создавал объект Speaker в не-пользовательском потоке. Обратный вызов onInit () будет происходить в потоке пользовательского интерфейса / основном потоке.

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

так что мой обновленный код выглядит так

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 голосов
/ 29 марта 2012

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

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

0 голосов
/ 29 марта 2012

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

...