2011-05-27 32 views
2

我寫過一個應用程序,它在啓動時處理大量數據;該應用程序的第一次啓動時間相當緩慢,但後續啓動時間也是如此。如何提高我的應用的ActivityManager加載時間?

我以前認爲,相對未反應的啓動時間(約7秒),是由於在第一負載數據處理 - 位的調試建議約2秒至冷負荷。所以,我重新設計了我的數據結構,以便他們在推出之間更容易序列化到永久存儲(所以緩存的東西),現在保存狀態時,應用程序完成約20毫秒,並且裝載時間大約爲10-20ms。好多了。 (PS它不使用內置的Java序列化,作爲國家文件現在都那麼簡單,它更容易在一個普通的拯救,人類可讀(和可編輯)文本文件 - 它仍然從這個重裝雖然相當快!)

不過,我仍然發現該應用程序啓動時間約5秒 - 我看着在aLogCat其中有一個條目:

I/ActivityManager(...) blah blah blah: +5s193ms 

所以超過5秒加載一個相對簡單的佈局(幾個嵌套LinearLayouts,和幾個TextViews - 沒什麼特別的,和沒有圖像) - 誠然,那個時候下山,隨後啓動(我關閉應用程序,然後再次打開它,它的〜700毫秒;沖洗和重複類似的結果)。

SOOOO我的問題是:我怎麼能提高應用程序的加載時間?我很高興第一次加載需要一段時間來處理所有事情 - 沒關係。但是有什麼辦法可以讓事情保持在記憶中,或者至少讓它進入可恢復狀態,所以無論ActivityManager在做什麼都不需要那麼長時間?我希望它能成爲我可以打開的東西(可能必須進行長時間搜索或類似搜索),然後再次關閉它 - 因此需要快速打開!

感謝提前:)

勒布

+0

感謝您的回覆 - 我現在使用ASyncTasks進行咕嚕作業,這似乎對於需要很長時間的事情來說是完美的 - 而且我已經將我的UI線程留下了光線:) – Seb 2011-05-28 01:19:46

+0

我還發現「traceview」和找出了瓶頸的確切位置(一個非常有用的工具!),並將它們壓扁... – Seb 2011-05-28 01:20:53

+0

另外,我還發現通過使用traceview事件Html.fromHtml非常昂貴。更重要的是(從我所能看到的)直接設置文本大小...所以也刪除了這些,現在它正在飛!謝謝大家的幫助:) – Seb 2011-05-28 01:21:51

回答

2

運行在您在onCreate啓動一個後臺線程的重載啓動的後續工作。 (一個AsyncTask對此很有幫助。)設計你的UI,當沒有數據時顯示一些有意義的東西(至少是一個不確定的進度條)。加載數據時,發佈Runnable(或在您的AsyncTask中實現onPostExecute)以將UI更新爲真實的東西。

+0

這是完美的 - 現在我正在做的 - ASyncTasks看起來非常強大,非常適合這項工作。 雖然我做的一個查詢是關於「Looper」 - 我不得不在doInBackground的開頭調用Looper.prepare(),以使onPostExecute函數不會崩潰我的應用程序 - 雖然沒有找到任何特別明確的定義,但... – Seb 2011-05-28 01:24:25

+0

關於onPostExecute類的方法,你可以用UI更新UI,需要啓動一個Runnnable。 – Dayerman 2011-05-28 10:56:27

0

特德建議,只做UI線程上的最低。加載佈局的時間太長,這意味着有一些啓動方法需要很長時間(可能查詢數據庫或訪問網絡來填充長ListView?)。

如果這個處理是絕對必需的,那麼使用啓動畫面(帶有「請稍候,加載數據」或類似的標籤)。

0

使用Asyntasks類劃分工作。如果您有一些數據始終保存在數據庫中,例如在您下次打開應用程序時有最快的訪問權限,並且不時更新該內容。

相關問題