在工作线程上初始化TextToSpeech对象

多年来(字面上看),我的应用程序遭受了糟糕的文本到语音引擎的困扰,特别是在调用时的初始化时间:

tts = new TextToSpeech(context, myOnInitListener); 

以上可能会导致用户界面滞后,如果你search“文本到语音初始化缓慢”,你会发现很多post。 embedded的高品质IVONA声音曾经是最糟糕的罪魁祸首,但谷歌TTS引擎现在已经获奖。

他们最新的APK更新,导致初始化的重大滞后 – 无需testing这个代码,你可以去你的Android的文本到语音设置,并尝试切换可用的引擎,同时按下“听取样本”,滞后被certificate“很好”。

为了解决这个问题,我已经实现了以下function:

 private volatile TextToSpeech tts; AsyncTask.execute(new Runnable() { @Override public void run() { tts = new TextToSpeech(context, volatileOnInitListener); } }); 

这已经完全消除了初始化的滞后,但是我担心这可能会有副作用,我还没有考虑到呢? 任何人都可以想到任何?

我也困惑,因为我相信TextToSpeech构造是asynchronous的,因此将这个构造函数移动到工作线程应该没有区别? 如果这个实现是前进的方向,Google为什么不在TextToSpeechSettings中实现它?

希望有人能澄清以上内容。 提前致谢。

编辑 – 当我说'构造函数是asynchronous的',我真的是指引擎初始化过程开始,最终调用onInit

我曾经相信TextToSpeech构造函数是asynchronous的

这只是部分正确的。 很多初始化是同步执行的。 这是来源

如果这个实现是前进的道路,那么Google为什么不在TextToSpeechSettings中实现呢?

看起来谷歌似乎很less检查他们的代码如何运行在中低端设备上,我认为滞后不会显示在高端设备上。 (在目前的YouTube应用程序中可以看到这种情况的另一个例子,我个人可以确认在中端设备上的滞后,而在高端设备上没有滞后。)这是纯粹的猜测,因为我不隶属于谷歌。

我担心这可能会有副作用,我没有考虑过? 任何人都可以想到任何?

唯一的(明显的)副作用是不能同步使用tts引擎,但必须等待asynchronous任务完成。 但无论如何,情况已经如此。 你所做的唯一的事情就是在UI线程之外执行一些代码,这个代码并不期望在UI线程上运行。 这不应该是一个问题。 即使有问题,您也只能通过在应用程序中testing才能find它。

一般来说,你很好走。