android:TextToSpeech泄漏服务连接

问题描述:

我想创建一个使用文本到语音的应用程序。每当我从活动Text_entry移动到活动CombChange,并返回我在日志猫(下面)中收到这些服务连接泄漏错误。android:TextToSpeech泄漏服务连接

任何人都可以看到为什么?

我只贴了Text_Entry和CombChange类的相关位 - 所以有可能会丢失声明和大括号等

public class Text_entry extends Activity implements OnTouchListener, TextToSpeech.OnInitListener{ 

    speech = new Speech(this); 
     Intent checkTTSIntent = new Intent(); 
     checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE); 

    Intent intent2 = new Intent(this, CombChange.class); 
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent2.putExtra("newPat", enteredNumber); 
    startActivity(intent2); 
} 

@Override 
    public void onResume() { 
     super.onResume(); 
     Intent intent = getIntent(); 
     String hc =" "; 
     hc = intent.getExtras().getString("helpComb"); 
     if (hc.equals("true")) 
      helpComb = true; 
     else 
      helpComb = false; 
    } 

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == MY_DATA_CHECK_CODE) { 
      if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
       speech = new Speech(this); 
      } 
      else { 
       Intent installTTSIntent = new Intent(); 
       installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installTTSIntent); 
      } 
      } 
    } 

public class CombChange extends ListActivity { 
    speech = new Speech(this); 
    speech.changeText("enter the new combination"); 
    speech.speaks(); 
    SystemClock.sleep(1300); 
     Intent intent = new Intent(this, Text_entry.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    intent.putExtra("helpComb", "true"); 
    speech.cleanUp(); 
    startActivity(intent); 
} 

public class Speech implements TextToSpeech.OnInitListener { 

    private String toRead; 
    private TextToSpeech tts; 
    public Speech(Context c) { 
     tts = new TextToSpeech(c, this); 
     tts.setPitch(1.2f); 
     tts.setSpeechRate(1.5f); 
    } 
    public void speaks() 
    { 
     speakOut(); 
    } 

    public void changeText(String changeTo) 
    { 
     toRead = changeTo; 
    } 


    public void cleanUp() { 
     //Don't forget to shutdown tts! 
     if (tts != null) { 
      tts.stop(); 
      tts.shutdown(); 
     } 
    } 


    public void onInit(int status) { 

     if (status == TextToSpeech.SUCCESS) { 

      int result = tts.setLanguage(Locale.UK); 

      if (result == TextToSpeech.LANG_MISSING_DATA 
        || result == TextToSpeech.LANG_NOT_SUPPORTED) { 
       Log.e("TTS", "This Language is not supported"); 
      } else { 
       speakOut(); 
      } 

     } else { 
      Log.e("TTS", "Initilization Failed!"); 
     } 

    } 
    protected void onStop() 
    { 

     if(tts != null){ 
      tts.shutdown(); 
     }  
    } 
    private void speakOut() { 
     tts.speak(toRead, TextToSpeech.QUEUE_FLUSH, null); 
     } 
    } 

03-21 16:42:32.515: I/TextToSpeech(24023): Sucessfully bound to com.google.android.tts 
03-21 16:42:32.535: E/ActivityThread(24023): Activity org.BT.Text_entry has leaked ServiceConnection [email protected] that was originally bound here 
03-21 16:42:32.535: E/ActivityThread(24023): android.app.ServiceConnectionLeaked: Activity org.BT.Text_entry has leaked ServiceConnection [email protected] that was originally bound here 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:965) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:859) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ContextImpl.bindService(ContextImpl.java:1344) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ContextImpl.bindService(ContextImpl.java:1336) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.content.ContextWrapper.bindService(ContextWrapper.java:401) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.speech.tts.TextToSpeech.connectToEngine(TextToSpeech.java:627) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:597) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:553) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:527) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:512) 
03-21 16:42:32.535: E/ActivityThread(24023): at org.BT.Speech.<init>(Speech.java:14) 
03-21 16:42:32.535: E/ActivityThread(24023): at org.BT.Text_entry.onCreate(Text_entry.java:97) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.Activity.performCreate(Activity.java:5184) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.os.Looper.loop(Looper.java:137) 
03-21 16:42:32.535: E/ActivityThread(24023): at android.app.ActivityThread.main(ActivityThread.java:4898) 
03-21 16:42:32.535: E/ActivityThread(24023): at java.lang.reflect.Method.invokeNative(Native Method) 
03-21 16:42:32.535: E/ActivityThread(24023): at java.lang.reflect.Method.invoke(Method.java:511) 
03-21 16:42:32.535: E/ActivityThread(24023): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
03-21 16:42:32.535: E/ActivityThread(24023): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
03-21 16:42:32.535: E/ActivityThread(24023): at dalvik.system.NativeStart.main(Native Method) 
03-21 16:42:32.670: I/TextToSpeech(24023): Sucessfully bound to com.google.android.tts 
03-21 16:42:32.670: D/(24023): 3333333333333333333333333333333333333333333333333 
03-21 16:42:32.670: E/SpannableStringBuilder(24023): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
03-21 16:42:32.670: E/SpannableStringBuilder(24023): SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length 
03-21 16:42:32.775: I/TextToSpeech(24023): Connected to TTS Service 
03-21 16:42:32.780: I/TextToSpeech(24023): Connected to TTS Service 
+0

您的应用程序是否实际运行?在CombChange类中根本没有方法。 – 2013-03-21 17:54:48

我相信这能解决你的问题,但我不能在你的代码来解释它 - 也许别人在这里可以 http://www.stevenmarkford.com/android-activity-has-leaked-serviceconnection-that-was-originally-bound-here/

我不知道多少,这会帮助,但请尝试在Activity类中实现onPause()方法。明确解除您的服务。 对于前:

@Override 
     protected void onPause() { 
      super.onPause(); 
      CalculatorUser c=new CalculatorUser(); //your Activity name object 
      c.unbindService((ServiceConnection) this); 
     } 

解除绑定可能会解决你的问题,“活动‘APP’已泄漏ServiceConnection”发生主要是当你移动你的活动,所以你需要明确地告诉到Android OS请从服务解除绑定我我的活动正在使用截至目前。当你再次启动你的App时,它将绑定到服务。如果它没有帮助发送我的代码,我会尽力为你解决它。

实际回答这个问题:

您需要服务时被销毁调用destroy()TextToSpeech对象。

我有这个问题,看到你的问题,所以我想我会回答任何来到这里的其他人。

对我来说关闭TextToSpeech对象。

@Override 
protected void onDestroy() { 
    tts.shutdown(); 
    super.onDestroy(); 
}