我目前面临以下问题:每当我的Android应用程序启动时,它都需要执行一些耗时的初始化代码。如果没有此代码,应用程序中的所有活动/服务都将无法正常运行。
到目前为止,我已将此初始化代码放入SplashScreen活动中,我在清单中将其声明为MAIN活动。一旦执行了初始化代码,我就完成()启动画面并启动实际的主要活动,即一个包含多个选项卡的活动,用户可以从中进行其他几项活动。
现在的问题如下:当我的应用程序放在后台时,经过一段时间后,在启动其他应用程序后,我的应用程序/进程被终止。当我从主屏幕重新启动它时,Android会恢复活动堆栈(任务)并在它们上调用onCreate()。但是,不执行启动画面活动,因此不执行初始化代码,这会导致异常。
我现在可以将初始化代码放在应用程序的onCreate()中,但是这会导致黑屏,直到方法结束。
有没有人知道我在启动时在哪里以及如何正确初始化我的应用程序?
初始化代码:
public void init() {
if (initialized) {
return;
}
// Initialize terms
List<Tag> tags= DynamicDao.loadAll(Tag.class);
int numTags = tags.size();
terms = new String[numTags];
for (int i = 0; i < numTags; i++) {
terms[i] = tags.get(i).getTag();
}
// Initialize document-term matrix
List<Item> items = DynamicDao.loadAll(Item.class);
createDocumentTermMatrix(items);
initialized = true;
}
注意:Item有几个关联的标签,我需要从中创建一个文档向量。
答案 0 :(得分:2)
你的初始化有多贵?你在那儿做什么?一般来说,我建议不要使用启动画面(它是移动应用程序,而不是桌面应用程序)。相反,在显示主UI时使用工作线程初始化数据,然后在工作线程完成后使用handler初始化UI。
或者,我会研究为什么初始化需要这么长时间并进行优化。你在那做什么?
答案 1 :(得分:2)
如果你真的必须执行持久的操作,那么你应该使用AsyncTask。它使用起来非常简单,它为您提供了两个函数,分别是 onPreExecute 和 onPostExecute ,它们分别在操作前后的主线程中调用。 所有昂贵的东西应该放在 doInBackground 中,这将在工作线程中工作。
在进行该操作时,您可以显示一个进度对话框(在上面提到的 onPreExecute 中创建它),通过使用提供的回调之一显示您正在进行的操作的进度: onProgressUpdate 强> 然后,您将关闭上面提到的 onPostExecute
内的对话框答案 2 :(得分:0)
如果您想保留当前的启动画面,您有几个选择。
如果您的数据结构不是太大,可以将其存储在onSaveInstanceState中,并将其恢复为onRestoreInstanceState和/或onPostCreate。
如果数据太大,您可能只需要检查您的应用是否在onResume中初始化,或者是其他各种启动方法,如onRestart,onStart等。(我仍然有点朦胧什么时候应该使用。)如果没有,请启动启动画面活动。
其他人对此主题的建议也很好。但如果您需要快速修复,这可能对您有用。