2010-09-10 78 views
6

我目前面臨以下問題:每當我的Android應用程序啓動時,它需要執行一些耗時的初始化代碼。沒有此代碼,應用程序中的所有活動/服務將無法正常工作。初始化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; 
} 

注意:一個項目有幾個相關的標籤,從中我需要創建一個文檔向量。

回答

2

您的初始化有多貴?你在那兒做什麼?一般來說,我建議不要使用啓動畫面(這是一個移動應用程序,而不是桌面應用程序)。相反,在顯示主UI時使用工作線程來初始化數據,然後在工作線程完成後使用處理程序初始化UI。

另外,我會研究爲什麼你的初始化需要這麼長時間,並優化它。你在那做什麼?

+0

在初始化期間,我創建了一個大小爲50x70的雙精度矩陣,以便加速某些計算。這個計算在Nexus One上需要大約2-3秒,對於HTC Magic來說需要6秒,並且在模擬器上仍然要稍長一點。初始化算法不能再被優化。最終(但我不太相信這個想法)我可以在首次啓動應用程序時將此計算結果寫入文件中,然後閱讀並隨後更新...... – Matthias 2010-09-10 17:45:06

+0

編寫3500雙打應該不需要3秒鐘。看起來有點不對 – Falmarri 2010-09-10 17:55:51

+0

也許我需要提供一些更多的細節:這個矩陣是一個字 - 文檔矩陣,我使用應用程序的SQLite數據庫中的條目進行預先計算,然後用它計算相似性。 – Matthias 2010-09-10 18:02:34

1

如果您確實需要執行長時間的操作,那麼您應該使用AsyncTask。它的使用非常簡單,它提供了兩個函數onPreExecuteonPostExecute它們分別在操作前後在主線程中調用。 所有昂貴的東西都應該在doInBackground這將在工作線程中工作。

當你正在做的操作,您可以顯示一個進度對話框使用提供的回調的一個(創造它上面裏面提到onPreExecute),顯示你正在做的事情的進展:onProgressUpdate 然後你會關閉上面提到的內部對話框onPostExecute

+0

不知道爲什麼我不能評論其他答案會在這裏發表評論:如果你要計算的矩陣被多個活動使用,而不是使這個類成爲一個單獨的類,那麼你可以很容易地進行子類化應用程序(http://developer.android.com/reference/android/app/Application.html)類(它將作爲應用程序的活動或服務中的一個運行而存在),您可以在其中存儲矩陣然後可以從您的程序的任何部分訪問。 – lucabox 2010-09-10 19:00:38

+0

從多個活動中訪問矩陣不是問題。問題是在哪裏計算這個矩陣。在SplashScreenActivity中,在單例線程類或Application.onCreate()中。 Application.onCreate()不是一個選項,因爲用戶看到一個黑屏直到計算正在進行 - 我沒有看到任何可以自定義它的可能性,例如,通過顯示自定義圖像。如果我使用SplashScreenActivity,那麼我遇到問題中所述的問題。 – Matthias 2010-09-10 19:07:25

+0

事實上,我的觀點(請參閱主要答案)是使用** AsyncTask **不要阻塞主線程。在任何**情況下都需要一個單獨的線程,否則UI將被阻塞,並且AsyncTask是一種在不同線程中執行某些事情並在操作結束時收到通知並更新進度的好方法(因此我提到的進度更新回調)。我提到Application類可以用來存儲操作的結果,以便可以通過應用程序中存在的任何活動/服務輕鬆訪問。 – lucabox 2010-09-10 19:30:28

0

如果你想保留當前的啓動畫面,你有兩個選項。

如果您的數據結構不是太龐大,可以將它存儲在onSaveInstanceState中並將其恢復到onRestoreInstanceState和/或onPostCreate中。

如果數據太大,您可能需要檢查您的應用是否在onResume中初始化,或者是其他各種啓動方法(如onRestart,onStart等)中的其中一種。(我仍然有點朦朧在什麼時候應該使用什麼。)如果沒有,開始你的啓動畫面Activity。

其他人對此主題的建議也很好。但如果您需要快速修復,這可能對您有用。