我必须初始化TTS的对象,因为加载了活动,但是当我初始化我的TextTOSpeech对象时,它需要4-5秒来启动activity。我试图在异步任务和线程中初始化它,但结果是相同的。怎样才能让我的活动加载得更快?下面是初始化TTS对象的线程的代码。
class LoadingThread implements Runnable{
@Override
public void run() {
//load settings of the app
appSettings = new AppSettings(getApplicationContext());
appSettings.loadSettings();
//making ready TTS before the user interact with it
textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
ttsOptions = new HashMap<String, String>();
ttsOptions.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,ActivityMain.UTTER_ID);
textToSpeech.setLanguage(Locale.ENGLISH);
textToSpeech.setSpeechRate(AppSettings.getSpeakerSpeed());
}
});
textToSpeech.setOnUtteranceCompletedListener(new TextToSpeech.OnUtteranceCompletedListener() {
@Override
public void onUtteranceCompleted(String s) {
ActivityMain.mNotepad.onStopSpeaker(s);
}
});
}
}我在我的活动的onResume()中调用这个线程,比如
LoadingThread thread = new LoadingThread();
thread.run();发布于 2016-01-29 23:13:27
应用程序class不是这样做的地方。如果您愿意,也可以使用应用程序的onCreate()方法来启动Service。您应该在Service中实现此后台线程,因为Service的目的是在后台执行操作。应用程序class应该很少使用。这是维护最小数量的全局状态的最后手段。
一旦你把这段代码移到Service中,安卓就已经为你调用了Looper.prepare()。
当OP调用他的FileManager类的构造函数时,他实际上是试图在Thread中创建一个Handler。虽然我上面的评论仍然是正确的,但它与OP的问题无关,因为他只是对Activity而不是Application进行了子类化。
需要明确的是,实际问题是他在一个线程中创建了一个Handler,而这个线程还没有调用Looper.prepare() (通过新的FileManager())。正确的修复方法是在主线程上创建处理程序,即在Activity或Service callbacks中创建处理程序。
发布于 2016-01-29 23:27:39
你错误地启动了你的线程,你只是调用了Runnable的run方法,它在同一个线程中执行。如果您需要在单独的线程中运行它,请使用:
new Thread(new LoadingThread()).start();另外,你很可能会在这里得到异常,因为这需要在主线程上运行:
ActivityMain.mNotepad.onStopSpeaker(s);您需要使用处理程序或Activiy.runOnUiThread()方法来处理此问题
发布于 2016-01-29 23:37:54
您需要调用new Thread(runnable).start()来在不同的线程上运行它,而不是在runnable.run()上。
https://stackoverflow.com/questions/35087550
复制相似问题