Android活动加载时间太长
我必须初始化TextTOSpeech API的对象,因为活动已加载,但在初始化我的TTS对象时,启动活动需要4-5秒。我尝试在异步任务和线程中初始化它,但结果相同。如何使我的活动加载更快?下面是初始化TTS对象的线程的代码Android活动加载时间太长,android,multithreading,android-activity,Android,Multithreading,Android Activity,我必须初始化TextTOSpeech API的对象,因为活动已加载,但在初始化我的TTS对象时,启动活动需要4-5秒。我尝试在异步任务和线程中初始化它,但结果相同。如何使我的活动加载更快?下面是初始化TTS对象的线程的代码 class LoadingThread implements Runnable{ @Override public void run() { //load settings of the app
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);
}
});
}
}
应用程序
类
是执行此操作的错误位置。如果需要,可以使用应用程序的onCreate
()方法启动服务。您应该在服务
中实现此后台线程,因为服务
的目的是在后台做事情。应用程序类
应该很少使用。这是维持最低限度的全球状态的最后手段
一旦您将此代码移动到服务中
,Looper.prepare()
将已经被Android调用
OP实际上是在调用他的文件管理器
类的构造函数时,试图在线程
内部创建一个处理程序。虽然我上面的评论仍然正确,但这与OP的问题无关,因为他是活动的子类化,而不是应用程序的子类化
明确地说,实际的问题是,他在一个尚未调用Looper.prepare()
(通过新的FileManager())的线程内创建了一个处理程序。正确的修复方法是在主线程上创建处理程序,即在活动
或服务回调中的一个中
如果线程启动不正确,只需调用在同一线程中执行的Runnable的run方法。
如果需要在单独的线程中运行,请使用:
new Thread(new LoadingThread()).start();
此外,您很可能会在此处遇到异常,因为这需要在主线程上运行:
ActivityMain.mNotepad.onStopSpeaker(s);
您需要使用Handler或Activiy.runOnUiThread()方法来处理此问题您需要调用新线程(runnable).start()
在不同的线程上运行它,而不是runnable.run()
能否发布整个onCreate please和活动的XML。您是否在真实设备上尝试应用程序?因为模拟器可能有那么多时间启动。@katmanco我使用的是真实设备,而不是虚拟设备如果加载需要那么长时间,那么加载也需要那么长时间。你不会改变的。但是处理它的方式(根据谷歌的设计指南),你应该设计你的活动,让UI快速加载,并允许用户快速与之交互,即使他们必须在后台加载TTS api时看到进度微调器或其他东西。
ActivityMain.mNotepad.onStopSpeaker(s);