我在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;
}
首先,我需要明确究竟是什么? 指向第57行上的变量tts的堆栈跟踪是否为空。?
或者,TextToSpeech方法setOnUtteranceCompletedListener中是否发生了空指针异常?
扬声器实例是在粘性服务的主线程上创建的,当我调试我的代码时,TextToSpeech的回调也会回到同一个线程上。
我不明白变量tts怎么可能是null ???
顺便说一下,这个问题在我的最后是不可重现的。我在开发者控制台上多次报告了这个堆栈strace。
请指教,
答案 0 :(得分: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());
}
});
答案 1 :(得分:1)
我解决了这个问题,这是它的工作原理
有一种情况我在非ui线程上创建Speaker对象。 对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;
}
}
这似乎已经解决了我的问题,感谢每一个人的贡献,帮助我,...
答案 2 :(得分:0)
可能是设备上没有安装TextToSpeech引擎。
答案 3 :(得分:0)
我是否正确假设Speaker
是从主要活动之外调用的类?
似乎在构造函数之前调用了onInit方法。我看到你用日志标签检查了这个;你的结果是什么?