MainActivity has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414ee400 that was originally bound here

无人久伴 提交于 2019-12-01 14:59:16

问题


In my app I recognize the user saying "exit" or "close" and the app should close. With this code

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;
            }
        }
    }
} 

I get this runtime error, after the speech recognition.

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)

If I try to destroy the SpeechRecognizer I get another runtime error because sr is null.

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

Log

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

What should I do?


回答1:


I think problem may be at line:

sr.destroy();

If sr be null, you get NullPointerException, and

super.onDestroy();

Dont has been called. Try do next:

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

or:

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



回答2:


The problem was the most trivial ever: I declared the SpeechRecognizer two times, one for the class and another inside the onCreate() method. The variable was initialized only in the function scope, so outside the function sr was always null.



来源:https://stackoverflow.com/questions/19930999/mainactivity-has-leaked-serviceconnection-android-speech-speechrecognizerconnec

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!