【问题标题】:MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414ee400 that was originally bound hereMainActivity 泄露了原本绑定在这里的 ServiceConnection android.speech.SpeechRecognizer$Connection@414ee400
【发布时间】:2013-11-24 17:01:43
【问题描述】:

在我的应用中,我认出用户说“退出”或“关闭”,应用应该关闭。 使用此代码

SpeechRecognizer sr;
Map<String, Integer> dictionary;
private static final int EXIT = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    populateDictionary();
    SpeechRecognizer sr = SpeechRecognizer.createSpeechRecognizer(this);
    sr.setRecognitionListener(this);
    Intent voiceIntent = RecognizerIntent.getVoiceDetailsIntent(getApplicationContext());
    sr.startListening(voiceIntent);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

private void populateDictionary() {
    dictionary = new HashMap<String, Integer>();
    dictionary.put("exit", EXIT);
    dictionary.put("close", EXIT);
}

@Override
public void onResults(Bundle results) {
    ArrayList<String> strList = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
    for (int i = 0; i < strList.size();i++ ) {
        String sentence = strList.get(i).toLowerCase(Locale.getDefault());
        Integer operation = dictionary.get(sentence);
        if(operation != null){
            switch(operation){
                case EXIT:{
                    this.finish();
                };break;
            }
        }
    }
} 

在语音识别之后出现此运行时错误。

11-12 15:38:05.351: E/Trace(14934): error opening trace file: No such file or directory (2)
11-12 15:38:05.511: D/libEGL(14934): loaded /system/lib/egl/libEGL_mali.so
11-12 15:38:05.521: D/libEGL(14934): loaded /system/lib/egl/libGLESv1_CM_mali.so
11-12 15:38:05.521: D/libEGL(14934): loaded /system/lib/egl/libGLESv2_mali.so
11-12 15:38:05.541: D/OpenGLRenderer(14934): Enabling debug mode 0
11-12 15:38:08.884: E/ActivityThread(14934): Activity com.example.voicetest01.MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound here
11-12 15:38:08.884: E/ActivityThread(14934): android.app.ServiceConnectionLeaked: Activity com.example.voicetest01.MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound here
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:965)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:859)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ContextImpl.bindService(ContextImpl.java:1214)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ContextImpl.bindService(ContextImpl.java:1206)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.content.ContextWrapper.bindService(ContextWrapper.java:394)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:281)
11-12 15:38:08.884: E/ActivityThread(14934):    at com.example.voicetest01.MainActivity.onCreate(MainActivity.java:32)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.Activity.performCreate(Activity.java:5008)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2027)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2088)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ActivityThread.access$600(ActivityThread.java:134)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.os.Looper.loop(Looper.java:137)
11-12 15:38:08.884: E/ActivityThread(14934):    at android.app.ActivityThread.main(ActivityThread.java:4744)
11-12 15:38:08.884: E/ActivityThread(14934):    at java.lang.reflect.Method.invokeNative(Native Method)
11-12 15:38:08.884: E/ActivityThread(14934):    at java.lang.reflect.Method.invoke(Method.java:511)
11-12 15:38:08.884: E/ActivityThread(14934):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-12 15:38:08.884: E/ActivityThread(14934):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-12 15:38:08.884: E/ActivityThread(14934):    at dalvik.system.NativeStart.main(Native Method)

如果我尝试销毁 SpeechRecognizer,我会收到另一个运行时错误,因为 sr 为空。

@Override
public void onDestroy(){
    sr.destroy();
    super.onDestroy();
}

日志

11-12 15:29:24.383: E/Trace(13724): error opening trace file: No such file or directory (2)
11-12 15:29:24.633: D/libEGL(13724): loaded /system/lib/egl/libEGL_mali.so
11-12 15:29:24.633: D/libEGL(13724): loaded /system/lib/egl/libGLESv1_CM_mali.so
11-12 15:29:24.643: D/libEGL(13724): loaded /system/lib/egl/libGLESv2_mali.so
11-12 15:29:24.673: D/OpenGLRenderer(13724): Enabling debug mode 0
11-12 15:29:29.047: D/AndroidRuntime(13724): Shutting down VM
11-12 15:29:29.047: W/dalvikvm(13724): threadid=1: thread exiting with uncaught exception (group=0x40ccf318)
11-12 15:29:29.047: E/AndroidRuntime(13724): FATAL EXCEPTION: main
11-12 15:29:29.047: E/AndroidRuntime(13724): java.lang.NullPointerException
11-12 15:29:29.047: E/AndroidRuntime(13724):    at com.example.voicetest01.MainActivity.onResults(MainActivity.java:77)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at android.speech.SpeechRecognizer$InternalListener$1.handleMessage(SpeechRecognizer.java:442)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at android.os.Looper.loop(Looper.java:137)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at android.app.ActivityThread.main(ActivityThread.java:4744)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at java.lang.reflect.Method.invokeNative(Native Method)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at java.lang.reflect.Method.invoke(Method.java:511)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-12 15:29:29.047: E/AndroidRuntime(13724):    at dalvik.system.NativeStart.main(Native Method)
11-12 15:29:31.500: I/Process(13724): Sending signal. PID: 13724 SIG: 9

我该怎么办?

【问题讨论】:

    标签: android speech-recognition serviceconnection


    【解决方案1】:

    我认为问题可能出在:

    sr.destroy();
    

    如果 sr 为 null,你会得到 NullPointerException,并且

    super.onDestroy();
    

    Dont 已被调用。尝试下一步:

    if(sr!=null)
    {
        sr.destroy();
    }
    

    或:

    try{
            sr.destroy();
    } 
     catch (Exception e)
    {
     Log.e(TAG,"Exception:"+e.toString());
    }
    

    【讨论】:

    • 事实上 sr.destroy(); throws java.lang.NullPointerException: sr 是空的,所以我无法销毁它,但似乎只需调用 this.finish() 就可以打开语音识别服务。我现在不知道如何正确关闭它。
    • 如果你在:switch(操作)调用this.finish,为什么在this.finish之前你不调用sr.destroy?
    • 如果我在this.finish() 之前调用sr.destroy(),我会得到java.lang.NullPointerException
    • 为这两种情况添加了日志
    • 试试这个:sr.cancel; this.finish();在块切换
    【解决方案2】:

    这个问题是有史以来最简单的:我两次声明了SpeechRecognizer,一次用于类,另一次在onCreate() 方法中。该变量仅在函数范围内初始化,因此在函数之外sr 始终为空。

    【讨论】:

    • 那么你如何解决ServiceConnectionLeaked错误?
    • 我使用单例类来解决它。不要用不同的上下文初始化它,而是使用单例:)
    【解决方案3】:

    我对 Dialog 的解决方案:

    public void dismiss(){
        speech.stopListening();
        try{
            speech.destroy();
        }
        catch (Exception e)
        {
            Log.e(TAG,"Exception:" + e.toString());
        }
        super.dismiss();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多