【问题标题】:android: TextToSpeech leaking service connectionandroid:TextToSpeech泄漏服务连接
【发布时间】:2013-03-21 17:20:20
【问题描述】:

我正在尝试使用文本转语音创建应用程序。每当我从活动 Text_entry 移动到活动 CombChange 并返回时,我都会在日志 cat 中收到这些服务连接泄漏错误(如下)。

谁能明白为什么?

我只粘贴了 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 android.speech.tts.TextToSpeech$Connection@427fd290 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 android.speech.tts.TextToSpeech$Connection@427fd290 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

【问题讨论】:

  • 你的应用真的运行了吗?在 CombChange 类中根本没有方法。

标签: java android service text-to-speech serviceconnection


【解决方案1】:

我相信这可以解决您的问题,但是我无法用您的代码来解释它 - 也许这里的其他人可以 http://www.stevenmarkford.com/android-activity-has-leaked-serviceconnection-that-was-originally-bound-here/

【讨论】:

    【解决方案2】:

    我不确定这有多大帮助,但请尝试在 Activity 类中实现 onPause() 方法。并明确取消绑定您的服务。 例如:

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

    解除绑定可能会解决您的问题,并且“Activity 'APP' has leaked ServiceConnection”主要发生在您移出 Activity 时,因此您需要明确告诉 Android 操作系统请解除我与我的 Activity 目前正在使用的服务的绑定。当您再次启动您的应用程序时,它将绑定到服务。如果它没有帮助给我发送代码,我会尝试为你修复它。

    【讨论】:

      【解决方案3】:

      这个问题的实际答案:

      当服务被销毁时,您需要在您的TextToSpeech 对象上调用destroy()

      我遇到了这个问题,看到了你的问题,所以我想我会为其他来这里的人回答这个问题。

      【讨论】:

        【解决方案4】:

        对我来说,关闭 TextToSpeech 对象。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-18
          • 1970-01-01
          • 1970-01-01
          • 2015-12-04
          • 2017-02-15
          相关资源
          最近更新 更多