我可以在Android中使用静态TextToSpeech吗?

hca*_*ver 5 android text-to-speech

TextToSpeech构造函数看起来像是由Activity"拥有".我正在制作一个包含多个不同活动的应用程序,我不想为每个活动初始化一个新的TextToSpeech实例 - 我希望即使活动正在改变,语音也能顺利进行.

我的想法是让所有活动访问一个静态TextToSpeech对象,由第一个对象初始化.

  1. 有谁知道TextToSpeech实现是否是线程安全的?我猜不是,但有人可能知道.
  2. 如果我使用我的默认活动的上下文初始化它,那么当活动被销毁时,TextToSpeech实例是否会停止工作?

hca*_*ver 3

感谢那些告诉我传递 ApplicationContext 的人。事实证明,这很容易...难的是 TextToSpeech 对象是否保证线程安全。

感谢您的回答告诉我如何使某些东西成为线程安全的/假设它是线程安全的,但问题是该对象是否已经是线程安全的。我可能应该说,我可以很好地实现线程安全,但我想知道我是否需要打扰。我不想在不确定的情况下假设线程安全。

我运行了以下命令,它似乎有效。因此,我假设 Android SDK TTS 是线程安全的,但找不到任何文档说明在所有设备上假设这一点都是安全的,所以我将暂时包装我的 TTS 实例!

package com.example.testproject;

import java.util.Random;

import android.os.Bundle;
import android.app.Activity;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

public class TestActivity extends Activity implements OnInitListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tts = new TextToSpeech(getApplicationContext(), this);
    }

    TextToSpeech tts = null;

    @Override
    public void onInit(int arg0) {
        for (int i = 0; i < 100; ++i) {
            class Irritate implements Runnable {
                Irritate(int iIn) {
                    i = iIn;
                }

                @Override
                public void run() {
                    Random r = new Random();
                    try {
                        Thread.sleep(r.nextInt(2000));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    tts.speak(Integer.toString(i), TextToSpeech.QUEUE_ADD, null);
                }

                int i;
            }

            Thread t = new Thread(new Irritate(i));

            t.start();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)