效能不是單純的速度問題。只要你的應用顯示給使用者的速度很快,它將會被認為很快。想要做到顯示速度快,應用必須響應靈敏。比如,為了顯示得快,可以直到需要的時候才給物件分配記憶體,一種被叫做懶漢式初始化的技巧。在程式開發過程中,你最希望發現的就是在效能敏感的地方有執行較慢的**。
這些類裡特別令人感興趣的是所有的onsomething()方法,它們都被主線程呼叫,比如onstart()和onfocuschanged()。主線程,或者稱為ui執行緒,是你的應用程式主要所在的執行緒。儘管不被推薦,但是有可能你的所有**都執行在主線程。除了其他事情,主線程:
(1) 接收鍵盤訊息(比如,view.onkeydown()和activity.onkeylongpress())
(2) 畫view (view.ondraw())
(3) 生命週期事件發生(比如,activity.oncreate())
note:設計上許多方法在主線程被呼叫。當你重寫乙個方法,可以驗證它如何被呼叫的。安卓文件不會經常指定乙個方法是否在主線程被呼叫。
通常,主線程持續的接收發生了什麼事情的通知,不管事件是系統產生的還是使用者產生的。應用只有乙個主線程,所有的事件按順序處理。也就是說,現在很容易看出為什麼響應可能成為負面影響:佇列中的第乙個事件會在隨後的事件處理之前被處理,每次處理一條。如果某個事件需要很長時間,當它被處理的時候,其他事件就需要等待更長的時間。
優化activity的所有啟動序列函式非常重要,包括如下的呼叫:
(1) oncreate
(2) onstart
(3) onresume
當然,這些序列發生在activity被建立的時候,實際上執行次數可能比你想象的要多。比如當配置發生變化的時候,你當前的activity會被銷毀,乙個新的例項被建立,如下的序列呼叫會發生:
(1) onpause
(2) onstop
(3) ondestroy
(4) oncreate
(5) onstart
(6) onresume
這些序列執行的越快,使用者就可以越快的重新使用你的應用程式。最常見乙個配置改變是方向改變,這標誌著裝置已經被旋轉了。
note:應用程式可以指定它的activity配置改變的時候可以自己去處理,通過manifest中的android:configchanges屬性。這將導致onconfigurationchanged()的呼叫而不是將activity銷毀。
應用activity的oncreate()方法很可能包含setcontentview( )呼叫或者其他負責inflate資源的方法。因為inflate資源是乙個相對耗時的操作,可以通過減少布局的複雜性使得inflation更快(layout檔案,定義了你的應用的樣子)。簡化布局檔案複雜性的方法包括:
(1) 使用relativelayout而不是單純的linearlayout,保持layout盡量"flat"。不只減少了物件的分配數量,同樣使得事件的處理更快。
(2) 使用viewstub避免物件的建立(參考懶漢式初始化部分)
note:尤其要注意listview項的布局,因為在list中可能有很多項。使用sdk的layoutopt(sdk16以後使用lint)工具去分析你的布局。
基本的原則是保證任何在主線程的事情完成的盡可能的快,目的是保證應用的響應。然而,這經常被認為是在主線程做盡量少的事情。在大多數情況下,可以通過簡單的將操作移動到其他的執行緒或者延緩操作,達到應用的響應性,這兩個技巧通常不會導致**更難維護。在將乙個任務移動到另外乙個執行緒之前,確保你理解為什麼這個任務執行很慢。如果這是因為不好的演算法或者不好的實現,你需要修正它,因為如果僅僅是將任務移動到另外乙個執行緒,就像將灰塵掃到櫃子底下一樣。
安卓課程第一章
1.android本意指 機械人 谷歌公司將安卓的標識設計為乙個綠色的機械人,這個綠色的機械人表示安卓系統符合環保概念,是乙個輕薄短小,功能強大的移動系統,是第乙個真正為手機打造的開放性系統。2.安卓是一種基於linux的開源的作業系統,主要適用於移動智慧型裝置。3.通訊技術 1 第一代通訊技術 1...
精通安卓效能優化 第四章(二)
現在讓我們考慮另外乙個基本函式,需要兩個引數並且依賴於第乙個引數是否比第二個大返回0或者1,如listing 4 8所示。listing 4 8 比較兩個值 int32 t cmp 32 32 int32 t value1,int32 t value2 再一次,我們可以看到這個函式的彙編 如list...
機械優化設計第一章
1 數值計算法的迭代過程 梯度下降法及其變形 x k 1 x k a k s k 各種下降法基本式一樣,區別就在於步長a k 與s k 2 點距準則判定結束 x k x k 1 小於設定整數 精度 時結束迭代,解釋一下 是什麼意思,因為x不是乙個數,而是乙個vector,所以是有很多維的,用兩棟的意...