初始化Android应用程序

时间:2010-09-10 17:25:51

标签: java android sdk android-activity

我目前面临以下问题:每当我的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有几个关联的标签,我需要从中创建一个文档向量。

3 个答案:

答案 0 :(得分:2)

你的初始化有多贵?你在那儿做什么?一般来说,我建议不要使用启动画面(它是移动应用程序,而不是桌面应用程序)。相反,在显示主UI时使用工作线程初始化数据,然后在工作线程完成后使用handler初始化UI。

或者,我会研究为什么初始化需要这么长时间并进行优化。你在那做什么?

答案 1 :(得分:2)

如果你真的必须执行持久的操作,那么你应该使用AsyncTask。它使用起来非常简单,它为您提供了两个函数,分别是 onPreExecute onPostExecute ,它们分别在操作前后的主线程中调用。 所有昂贵的东西应该放在 doInBackground 中,这将在工作线程中工作。

在进行该操作时,您可以显示一个进度对话框(在上面提到的 onPreExecute 中创建它),通过使用提供的回调之一显示您正在进行的操作的进度: onProgressUpdate 然后,您将关闭上面提到的 onPostExecute

内的对话框

答案 2 :(得分:0)

如果您想保留当前的启动画面,您有几个选择。

如果您的数据结构不是太大,可以将其存储在onSaveInstanceState中,并将其恢复为onRestoreInstanceState和/或onPostCreate。

如果数据太大,您可能只需要检查您的应用是否在onResume中初始化,或者是其他各种启动方法,如onRestart,onStart等。(我仍然有点朦胧什么时候应该使用。)如果没有,请启动启动画面活动。

其他人对此主题的建议也很好。但如果您需要快速修复,这可能对您有用。