Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的TTS和Singleton_Android_Singleton_Text To Speech - Fatal编程技术网

Android中的TTS和Singleton

Android中的TTS和Singleton,android,singleton,text-to-speech,Android,Singleton,Text To Speech,我有一个应用程序大量使用TTS。它工作得很好,但我需要调整它 我在每个屏幕上都使用TTS对象,这不好。我希望我能只创建一次TTS对象(像一个单例对象),并在我的所有活动中使用它 以下是此操作的基本代码: public class SimOuNaoActivity extends Activity implements OnInitListener{ public TextToSpeech tts; private int MY_DATA_CHECK_CODE =

我有一个应用程序大量使用TTS。它工作得很好,但我需要调整它

我在每个屏幕上都使用TTS对象,这不好。我希望我能只创建一次TTS对象(像一个单例对象),并在我的所有活动中使用它

以下是此操作的基本代码:

    public class SimOuNaoActivity extends Activity implements OnInitListener{
    public TextToSpeech tts;
        private int MY_DATA_CHECK_CODE = 0;


        @Override
        public void onCreate(Bundle savedInstanceState) {

          super.onCreate(savedInstanceState);
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
    tts.speak("Testing 1,2,3", TextToSpeech.QUEUE_ADD, null);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            tts = new TextToSpeech(this, this);
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent
                    .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }

}

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
        // Toast.LENGTH_LONG).show();
    } else if (status == TextToSpeech.ERROR) {
        // Toast.LENGTH_LONG).show();
    }
}

@Override
public void onDestroy() {
    if (tts != null) {
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
       System.gc();
    }

    }
在我的所有活动中使用TTS对象的正确方法是什么?请记住,它使用了一些方法,如startActivityForResult等。。。所以我想知道我能做些什么使这项工作顺利进行

有人能帮我吗

感谢您的帮助


谢谢

看看这里,在安卓系统中以更好的设计在活动和程序之间共享内容:

您可能希望在应用程序中实例化并保存Singleton对象,但无论如何只能实例化一次,因此只需将TTS初始化代码放在自己的类中,并在应用程序中将该类实例化为对象即可。您需要将应用程序作为TTS将被实例化的上下文传递给TTS类

public class MyApplication extends Application {
    public MyTTS myTTS;
    public void onCreate() {
        myTTS = new MyTTS(this);
    }
}

然后,您可以从Activities中使用getApplication().myTTS.whateverMethodsYouMake(yadayada)访问应用程序单例化TTS类。

这相对简单-只需按如下方式实现,不要忘记将应用程序上下文(
This.getApplicationContext()
)作为上下文传递而不是活动上下文

public class SingletonTTS {

private static SingletonTTS instance;
private static Context ctx;
private TextToSpeech mTTS;
private static boolean TTSready = false;

private SingletonTTS(Context context) {
    ctx = context;
    mTTS = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int i) {
            TTSready = true;
            configTTS();

        }
    });
}

public static synchronized SingletonTTS getInstance(Context context) {
    if (instance == null) {
        instance = new SingletonTTS(context);
    }
    return instance;
}

public static boolean isTTSready(){
    return TTSready;
}

private void configTTS() {
    Toast.makeText(ctx, "supports " + mTTS.isLanguageAvailable(Locale.getDefault()), Toast.LENGTH_LONG).show();
    int available = mTTS.isLanguageAvailable(Locale.getDefault());
    if( available != TextToSpeech.LANG_MISSING_DATA
            && available != TextToSpeech.LANG_NOT_SUPPORTED ){
        mTTS.setLanguage(new Locale(Locale.getDefault().getLanguage()) );

    } else {
        /** TODO SAVE */
    }

}

public void speakSentence(String sentence){
    mTTS.speak(sentence, TextToSpeech.QUEUE_ADD, null);
}

}

那么,是什么阻止您将TextToSpeech对象设置为Singleton?在您的用例中,听起来是一件明智的事情。您可以在自己的应用程序子类中设置它,以便从所有活动中轻松访问它,或者,更方便的是,使用相关方法创建某种基本活动,从单例/应用程序委托调用TextToSpeech对象,并让所有其他活动扩展它。您好,MH,谢谢您的回答。有样本代码吗?我有点困在这里=别针而不是复制粘贴代码在这里,我建议你看看。可以找到另一个使用单例模式的TTS实现。请注意,在使用上并没有真正的共识。我将把决定权留给你。祝你好运应用程序上下文和活动上下文是完全相同的。这是因为
Activity
扩展了
ContextWrapper
,后者是实现
getApplicationContext
的类。它们都是上下文的实例,但应用程序实例与应用程序的生命周期相关联,而活动实例与活动的生命周期相关联。因此,他们可以访问有关应用程序环境的不同信息。是的,当然-我认为您应该编辑答案的最后一部分,以便更清楚地理解您的意思-“而不是活动上下文”->“而不是活动实例”