首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TTS泄漏的ServiceConnection

TTS泄漏的ServiceConnection
EN

Stack Overflow用户
提问于 2013-03-22 13:31:35
回答 3查看 6.3K关注 0票数 4

我正在我的应用程序中使用TTS。在onPuase方法中,我使用以下代码来停止引擎。问题是,每当我暂停使用主页按钮的活动时,我都会收到错误消息,因为我已经粘贴了log cat部分。我从日志cat (Activity com.example.DragDrop.PlaySeries已泄漏ServiceConnection )中了解到该问题是由于某些泄漏造成的。然而,问题并不是停止我的应用程序或干扰任何功能。但我想知道这个问题的严重性,以及如何避免这个问题?

请帮帮忙

代码语言:javascript
复制
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();   
    Log.i("PlaySeries", "In pause play series");
    if(tts !=null){
        Log.i("PlaySeries", "In pause play series");
        tts.stop(); 
    //  tts.shutdown();
    }
}

@Override
protected void onDestroy() {  
    //Close the Text to Speech Library
    if(tts !=null){
        Log.i("PlaySeries", "In pause play series");
        tts.stop(); 
        tts.shutdown();
    }
    super.onDestroy();
}

在onCreate中

代码语言:javascript
复制
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.series);

    tts = new TextToSpeech(this,this);
}

LogCat

代码语言:javascript
复制
 03-22 10:46:45.205: E/ActivityThread(3881): Activity com.example.DragDrop.PlaySeries has leaked ServiceConnection android.speech.tts.TextToSpeech$Connection@2bbe5960 that was originally bound here03-22 10:46:45.205: E/ActivityThread(3881): android.app.ServiceConnectionLeaked: Activity com.example.DragDrop.PlaySeries has leaked ServiceConnection android.speech.tts.TextToSpeech$Connection@2bbe5960 that was originally bound here03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): android.app.ServiceConnectionLeaked: Activity com.example.DragDrop.PlaySeries has leaked ServiceConnection android.speech.tts.TextToSpeech$Connection@2bbe5960 that was originally bound here03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 03-22 10:46:45.205: E/ActivityThread(3881): 
 03-22 10:46:45.205: E/ActivityThread(3881): 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-22 14:09:13

只需使用onDestroy代码即可

代码语言:javascript
复制
@Override
protected void onDestroy()
{
    super.onDestroy();

    tts.shutdown();
}
票数 13
EN

Stack Overflow用户

发布于 2014-01-01 06:48:45

当我将TTS对象设为静态对象时,我遇到了类似的错误(因此,即使设备旋转,TTS也会继续说话)。泄漏是在设备旋转时触发的,因此屏幕在纵向和横向模式之间切换。

有一段时间,我感到困惑,因为这个错误只在一些运行早期Android版本的旧设备上报告。然而,一旦我发现了修复程序,我怀疑这个问题在所有设备和版本中都是常见的,但可能在较新的型号上被屏蔽了。

修复方法是使用Application上下文初始化TTS对象,而不是使用当前(活动)上下文。

这是我的代码tts = new TextToSpeech(getApplicationContext(), this);

完整的不同之处在:http://code.google.com/p/android-tts-experiments/source/detail?r=b879fd1042151cbebc736b89a9fb660c895081ea

票数 10
EN

Stack Overflow用户

发布于 2017-01-11 20:15:08

这是我在活动之外/服务中为文语转换服务提供的TurnKey解决方案...

如果您不能使用onDestroy,只需监听它何时完成说话,然后关闭并停止它。使用应用程序上下文来防止泄漏。给你。

代码语言:javascript
复制
    import android.content.Context;
import android.os.Build;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;

import java.util.Locale;

/**
 * Created by acopp
 * Date: 1/11/2017.
 * Time: 6:11 AM
 * You have permission to use this file for any reason that is not for evil doing
 */

class SpeakThis{
    private Context mContext;
    private TextToSpeech mTextToSpeech;
    private String mTextToSpeak = "";
    private boolean mSpeechAvailable = false;

    SpeakThis(String text,Context context){
        mTextToSpeak = text;
        mContext = context.getApplicationContext();//THIS WILL FIX THE LEAK  THANKS TO JulianHarty

        mTextToSpeech = new TextToSpeech(mContext, mTextToSpeechListener);
        mTextToSpeech.setOnUtteranceProgressListener(mUtteranceListener);//NO ON DESTROY NEEDED JUST LISTEN FOR UTTERANCE STATUS
    }

    void talk(String talkThis){
        mTextToSpeak = talkThis;
        if(mSpeechAvailable){
            speak();
        }else{
            mTextToSpeech = new TextToSpeech(mContext, mTextToSpeechListener);
            mTextToSpeech.setOnUtteranceProgressListener(mUtteranceListener);
            mTextToSpeech.setSpeechRate(0.75f);
            mTextToSpeech.setPitch(1.2f);
        }
    }

    private TextToSpeech.OnInitListener mTextToSpeechListener = new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status == TextToSpeech.SUCCESS) {
                int result = mTextToSpeech.setLanguage(Locale.US);
                if (result == TextToSpeech.LANG_MISSING_DATA ||
                        result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e("TTS","SPEECH NOT AVAILALBE");
                    mSpeechAvailable = false;

                } else {
                    if(mTextToSpeak.length() > 2){
                        speak();
                    }
                    mSpeechAvailable = true;
                }
            } else {
                Log.e("TTS", "Initilization Failed!");
                mSpeechAvailable = false;
            }

        }
    };

    private void speak() {

        if (mTextToSpeak.length() > 0) {
            try {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                    mTextToSpeech.speak(mTextToSpeak, TextToSpeech.QUEUE_ADD,null,"toastText");
                } else {
                    //noinspection deprecation
                    mTextToSpeech.speak(mTextToSpeak, TextToSpeech.QUEUE_ADD, null);
                }
            } catch (Exception ignore) {

            }
        }
    }

    private UtteranceProgressListener mUtteranceListener = new UtteranceProgressListener() {
        @Override
        public void onStart(String s) {
        }

        @Override
        public void onDone(String s) {//STOP AND SHUTDOWN TTS WHEN COMPLETED TALKING
            try {
                mTextToSpeech.stop();
                mTextToSpeech.shutdown();
            } catch (Exception ignore) {
            }
        }

        @Override
        public void onError(String s) {

        }
    };
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15563361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档