導航:首頁 > 操作系統 > android布局優化

android布局優化

發布時間:2022-05-03 03:44:36

1. android studio hierarchy viewer 怎麼看布局是否需要優化

工具/原料

android 基礎
91桌面
數據線
android手機
方法/步驟

在手機安裝好91桌面哈,然後將頁面滑到最左面的「快速搜索頁」

hierarchyviewer.bat是sdk自帶的工具,在tools文件夾下。雙擊即可打開

在此頁面,加粗顯示的就是當前進程,點擊load view hierarchy就可以分層查看布局

左邊的大圖,為應用圖層的樹形結構。上面有控制項名稱和id等信息。然後下面三個圓點代表渲染的速度,綠色最快,紅色最慢,其中從左到右依次表示的是測量大小,布局和繪制。再看右下角的那個數字,代表的是此節點在父節點中的索引。

整張圖的右下角,表示的該應用的當前頁面。在左邊的樹形圖中點擊某個節點,會在這里用紅框標出響應的位置。左上角的圖可以查看當前選中節點的具體布局數據,寬高什麼的。

這里可以看出「快速搜索屏」的實現是,
draglayer--孩子--->workspacelayer-----孩子0---workspace;
------孩子1---singleViewGroup;
singleViewGroup就是快速搜索屏的布局view
在網上找到一個圖,覺得很好,介紹的精確完整,貼過來,給大家看看

2. 如何對Android客戶端性能優化

為什麼我們的App需要優化,最顯而易見的時刻:用戶say,什麼狗屎,刷這么久都沒反應,取關卸載算了。
這跟什麼有關,我們先蒼白的反駁下,尼瑪用戶設備老舊網又爛,關我屁事,根本不用優化。可是,老闆拍板了,施壓給CTO,然後CTO又來找你:Y的今天必須給我想辦法優化了,不然不準回家。
好吧,為什麼從UI的表象上看,App又卡又慢而且還錯亂。我們試著來剖析下吧。
題外話:把minSDK改到4.0+,去特么的low用戶,連手機都不願意換,還能指望它能給你帶來多少營收么,直接pass掉吧。4.0前的系統bug不少,不能為了彌補這些bug而降低了整體的高性能。
好了,讓我們先從UI說起:
首先要明白的是UI的繪制流程:measure-layout-draw,measure與layout都需要for loop所有的子控制項,匯集起來才能完成繪制,布局。所以子控制項越多,所消耗的時間越長(inflate,layout_weight,relative,多層嵌套等),減少不必要的子控制項或層級,是相當有必要的。你可以通過merge,viewstub這些標簽來減少層級嵌套。如果你的空間觀念沒那麼好,可以用HierarchyViewer工具來檢查。
對於Listview或者GridView這種多item的組件來說,復用item可以減少inflate次數,通過setTag,getTag的ViewHolder方式實現復用,這里要注意的是,holder中的控制項最好reset後再賦值,避免圖片,文字錯亂。
對於ViewPager第一次顯示時卡頓以及左右滑動卡頓,有以下幾種優化方式:

ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。
每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費
圖片顯示不出來或者載入時間太長,怎麼辦?分兩部分,下載速度,載入速度。

對於下載,要控制好同時下載的最大任務數(平均速度慢),同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)。
對於載入速度,我們要知道一點,雖然下載的圖片可能只有幾百K,但是decode成bitmap所佔用的內存可是成倍的,盡可能的減小圖片size是根本因素,讓服務端提供不同解析度的圖片才是最好的解決方案,內存總有耗盡的時刻,別老想著大解析度會更清晰,實際就只有150*150的空間,非給弄張1000*1000的圖片是不恰當的。另外論載入速度:內存>硬碟>網路,合理的使用內存緩存也是關鍵。假如自己寫不好,沒關系,有那麼多開源的圖片緩存框架,不用自己操心。
再說緩存
有很多種緩存方式,也不用Stay列舉了,我們要說的是搭配使用。

比方說,以前我們一直在用強引用,HashMap,後來我們發現占內存,我們就用軟引用,弱引用來及時回收,再後來因為回收機制不可控,所以又有了lrucache,disklrucache通過演算法來平衡內存與硬碟緩存。隨著android版本的推進與演化,我們也應該擁抱變化。如果你的App里還有軟引用,弱引用的地方,不妨再check下。
比方說網路+資料庫。網路我們一般都是去主動獲取,而非被動接受。那如果說數據是重復的或者未更改的呢?那我們去取一次網路數據有什麼意義呢?我的解決方案是給每個activity或fragment或每個組件設置一個最大請求間隔,比如一個listview,第一次請求數據時,保存一份到資料庫,並記下時間戳,當下次重新初始化時,判斷是否超過最大時間間隔(如5分鍾),如果沒有,只載入資料庫數據,不需要再做網路請求。當然,還有一些隱式的http請求框架會緩存伺服器數據,在一定時間內不再請求網路,或者當伺服器返回304時將之前緩存的數據直接返回。
反正也說到網路了,那我們也來說說

現在有很多現成HTTP框架供我們使用,我們幾乎只用寫配置就可以搞定一個url請求,但是這里有很多需要服務端配合的,比如:json數據格式,WebP代替jpg,支持斷點續傳,多個請求合並成一個,盡量不做重定向,伺服器緩存以及負載均衡等。
對客戶端本身,除了上述的實現,我們還需要合理的緩存,控制最大請求並發量,及時取消已失效的請求,過濾重復請求,timeout時間設置,請求優先順序設置等。
優化可不是一個人的事,實現一個功能簡單,但是想優化重構,那是很不容易的事。需要多方面的預判與聯調。合理的假設與實踐是優化最重要的手段。
說完這些具體的點,我們再來說說一些常識,或者稱之為代碼規范。

你要知道for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。
明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)
合理使用數據類型,比如StringBuilder代替String,(筆試題最常見的是str+="str"中有幾個對象) ,少用枚舉enum,少用父類聲明(List,Map)
如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。
你要知道單例的好處,並正確的使用它。
多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。
如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。
當然還有很多很多,Stay所說的也只是一個大的輪廓,還是需要自己不斷的嘗試。會開發寫代碼跟會做產品的區別還是蠻大的,僅僅是態度就能刷死80%的碼農了。當你碰到一些需要優化的地方,耐心的去分析,時間的累積會讓你成為真正的工程師。
另外優化也沒有絕對的完美,每一次優化都是基於當前的環境來做的,要明白溝通是最好的優化,不盲從,不隨便,三思而後行。
Android上如何做性能優化的?大概寫三年代碼就能差不多知道了。

3. android 性能優化有哪些辦法

性能優化的常用方法

主要內容包括布局優化,繪制優化,內存泄露優化,相應速度優化,ListView優化,Bitmap優化,線程優化等,下面主要給你舉了其中的幾個例子:

(1)布局優化

布局優化的思想很簡單,就是盡量減少布局文件的層級。

如何進行優化呢?首先刪除布局中無用的控制項和層級,其次有選擇地使用性能較低的ViewGroup,比如LinearLayout。如果布局中有的布局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,這是因為RelativeLayout比較復雜,他的布局過程花費更多的CPU時間。FrameLayout和LinearLayout一樣都是一種簡單高效的ViewGroup,因此可以考慮使用他們,但是很多時候,單純的通過一個LinearLayout或者FrameLayout無法實現產品的效果,需要通過嵌套的方式來完成,這種情況建議採用RelativeLayout,因為ViewGroup的嵌套就相當於增加了布局的層級,同樣會降低程序的性能。

布局優化的另一種手段是採用<include>標槍,<merge>標簽和ViewStub。<include>標簽主要用於布局重用,<merge>標簽一般和<include>配合使用,它可以減少布局的層級。而ViewStub則提供了按需載入功能,當需要時才將ViewStub中的布局載入到內存,這提高了程序的初始化效率。

(2)繪制方法

繪制優化是指View的onDraw方法避免執行大量的操作,這主要有兩方面。

首先,onDraw中不要創建新的布局對象,這是因為onDraw方法可能會被頻繁調用,這樣就會在一瞬間產生大量的臨時對象,這不僅佔用了過多的內存而且還會導致系統更加頻繁的gc,降低了程序的執行效率。

另一方面,onDraw方法中不要做耗時的任務,也不能執行成千上萬次循環操作,盡管每次循環都很輕量級,但是大量的循環仍然十分搶佔CPU的時間片,這會造成View的繪制過程不流暢。

(3)內存泄露優化

內存泄露在開發過程中是一個需要重視的問題,但是由於內存泄露問題對開發人員的經驗和開發意識要求比較高,因此這是開發人員最容易犯的錯誤之一。內存泄露的優化分為兩個方面,一方面是在開發過程中避免寫出內存泄露的代碼,另一方面通過一些分析工具比如MAT來找出潛在的內存泄露繼而解決。

關於性能優化的建議

1.避免黃健過多對象;

2.不要過多使用枚舉,枚舉佔用的內存空間比整型大一些。

3.常量使用staticfinal來修飾。

4.使用一些Android特有的數據結構,比如SpareArray和Pair等,他們都具有更好的性能。

5.適當使用軟引用和弱引用。

6.採用內存緩存和磁碟緩存

7.盡量採用靜態內部類,這樣可以避免潛在的內部類而導致的內存泄漏。

4. 如何對Android進行性能優化

不知道你是說對系統優化還是什麼app優化,

系統優化就只能找底層人員的了,我也不是很了解。

app優化的話,大體有以下幾個方面

  1. ui優化,去除累贅的布局,優化初始化的速度,提高apk流暢性。

  2. 網路交互優化,好的網路和數據處理方式決定了app的體驗性能。

  3. 檢查內存是否有泄漏,人們常說的anr詳細。

如何你問的是android手機優化。

平常人只能下載手機管家這種軟體進行清除內存,垃圾,卸載無用的apk,保持android系統的流暢性。

5. android 布局優化使用什麼標簽

android 布局優化主要使用抽象布局標簽

(1) <include>標簽
include標簽常用於將布局中的公共部分提取出來供其他layout共用,以實現布局模塊化,這在布局編寫方便提供了大大的便利。
下面以在一個布局main.xml中用include引入另一個布局foot.xml為例。main.mxl代碼如下:

java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
android:id="@+id/simple_list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="@dimen/dp_80" />

<include layout="@layout/foot.xml" />

</RelativeLayout>

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/simple_list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="@dimen/dp_80" /> <include layout="@layout/foot.xml" /> </RelativeLayout>
其中include引入的foot.xml為公用的頁面底部,代碼如下:

Java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_above="@+id/text"/>

<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_40"
android:layout_alignParentBottom="true"
android:text="@string/app_name" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="@dimen/dp_40" android:layout_above="@+id/text"/> <TextView android:id="@+id/text" android:layout_width="match_parent" android:layout_height="@dimen/dp_40" android:layout_alignParentBottom="true" android:text="@string/app_name" /> </RelativeLayout>

<include>標簽唯一需要的屬性是layout屬性,指定需要包含的布局文件。可以定義android:id和android:layout_*屬性來覆蓋被引入布局根節點的對應屬性值。注意重新定義android:id後,子布局的頂結點i就變化了。(2) <viewstub>標簽
viewstub標簽同include標簽一樣可以用來引入一個外部布局,不同的是,viewstub引入的布局默認不會擴張,即既不會佔用顯示也不會佔用位置,從而在解析layout時節省cpu和內存。
viewstub常用來引入那些默認不會顯示,只在特殊情況下顯示的布局,如進度布局、網路失敗顯示的刷新布局、信息出錯出現的提示布局等。
下面以在一個布局main.xml中加入網路錯誤時的提示頁面network_error.xml為例。main.mxl代碼如下:

Java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

……
<ViewStub
android:id="@+id/network_error_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/network_error" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > …… <ViewStub android:id="@+id/network_error_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout="@layout/network_error" /> </RelativeLayout>

其中network_error.xml為只有在網路錯誤時才需要顯示的布局,默認不會被解析,示例代碼如下:

Java<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<Button
android:id="@+id/network_setting"
android:layout_width="@dimen/dp_160"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="@string/network_setting" />

<Button
android:id="@+id/network_refresh"
android:layout_width="@dimen/dp_160"
android:layout_height="wrap_content"
android:layout_below="@+id/network_setting"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_10"
android:text="@string/network_refresh" />

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/network_setting" android:layout_width="@dimen/dp_160" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="@string/network_setting" /> <Button android:id="@+id/network_refresh" android:layout_width="@dimen/dp_160" android:layout_height="wrap_content" android:layout_below="@+id/network_setting" android:layout_centerHorizontal="true" android:layout_marginTop="@dimen/dp_10" android:text="@string/network_refresh" /> </RelativeLayout>

在java中通過(ViewStub)findViewById(id)找到ViewStub,通過stub.inflate()展開ViewStub,然後得到子View,如下:

Javaprivate View networkErrorView;

private void showNetError() {
// not repeated infalte
if (networkErrorView != null) {
networkErrorView.setVisibility(View.VISIBLE);
return;
}

ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);
networkErrorView = stub.inflate();
Button networkSetting = (Button)networkErrorView.findViewById(R.id.network_setting);
Button refresh = (Button)findViewById(R.id.network_refresh);
}

private void showNormal() {
if (networkErrorView != null) {
networkErrorView.setVisibility(View.GONE);
}
}
private View networkErrorView; private void showNetError() { // not repeated infalte if (networkErrorView != null) { networkErrorView.setVisibility(View.VISIBLE); return; } ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout); networkErrorView = stub.inflate(); Button networkSetting = (Button)networkErrorView.findViewById(R.id.network_setting); Button refresh = (Button)findViewById(R.id.network_refresh);} private void showNormal() { if (networkErrorView != null) { networkErrorView.setVisibility(View.GONE); }}

在上面showNetError()中展開了ViewStub,同時我們對networkErrorView進行了保存,這樣下次不用繼續inflate。這就是後面第三部分提到的減少不必要的infalte。

viewstub標簽大部分屬性同include標簽類似。上面展開ViewStub部分代碼

JavaViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);
networkErrorView = stub.inflate();
ViewStub stub = (ViewStub)findViewById(R.id.network_error_layout);networkErrorView = stub.inflate();
也可以寫成下面的形式

JavaView viewStub = findViewById(R.id.network_error_layout);
viewStub.setVisibility(View.VISIBLE); // ViewStub被展開後的布局所替換
networkErrorView = findViewById(R.id.network_error_layout); // 獲取展開後的布局
View viewStub = findViewById(R.id.network_error_layout);viewStub.setVisibility(View.VISIBLE); // ViewStub被展開後的布局所替換networkErrorView = findViewById(R.id.network_error_layout); // 獲取展開後的布局
效果一致,只是不用顯示的轉換為ViewStub。通過viewstub的原理我們可以知道將一個view設置為GONE不會被解析,從而提高layout解析速度,而VISIBLE和INVISIBLE這兩個可見性屬性會被正常解析。


6. Android平板開發需要注意的幾點

隨著移動平台的發展和其應用的不斷改善,質量成為決定成敗的關鍵。用戶要求他們選擇安裝的應用響應快、性能好,如果某個應用不能提供卓越的功能和穩定的用戶體驗,那這樣的應用註定會被很快卸載。
盡管現在android智能手機和平板電腦的運行速率越來越快,但開發者仍需牢記,應用的運行環境仍受到電池和處理器等諸多資源的限制。以下是給android應用開發者10個建議,以便能在當前和以後的所有android設備都能運行出最佳效果。
1.首先要有良好的編碼習慣

一個優秀的android應用開發者應該善於運用常識、完善的演算法和標准設計模式。要有資源意識,打開了就要記得關閉,盡量做到晚獲取,早釋放。這些由來已久的編碼准則同樣適用Android應用開發,尤其是使用基礎設備服務時。

2.讓阻塞操作遠離主UI線程

通過使用AsyncTask、線程、IntentService和自定義後台服務,保證應用的靈活性。使用載入工具簡化游標等長時間載入數據的狀態管理。當有其他程序運行時,不能讓應用滯後或中止。

如果一個操作需要消耗較多時間和資源時,取消該操作,換成非同步處理,這樣應用就能保持響應,用戶可以繼續各種操作。該方法適用磁碟讀寫、訪問內容提供方、資料庫和互聯網,以及解析和其他需要花費較長時間的任務。

3.使用最新的android SDK版本和API

使用android平台的最新產品,保證應用緊跟android的更新步伐。隨著android平台的不斷發展,部分功能可能被棄用或被更好的功能取代,核心API接收了bug修復和性能改進,新API有助於android應用開發者編寫出更穩定的應用。要明白最佳的做法總是隨著時間的推移而變,聰明的android應用開發者應該總是站在整個平台的最前沿。

4.考慮使用StrictMode

從android 2.3開始提供了一個新的類StrictMode,該類可以用於捕捉發生在應用程序主線程中耗時的磁碟、網路訪問或函數調用,可以幫助開發者改進程序,使主線程處理UI和動畫在磁碟讀寫和網路操作時變得更平滑,避免主線程被阻塞。

5.發布前禁用或盡量減少調試

如果android應用開發周期較長,很可能在應用中內置了一些日誌或調試代碼,在發布前確保這些功能已經最小化或完全禁用。

6.確保UI布局簡單優雅

簡單的屏幕不僅方便閱讀,還能加快載入速度。與其在一個單一屏幕上堆砌太多不必要的功能,不如花時間去開發優雅的用戶界面。簡單優雅的UI不僅能提高應用性能,還能提高用戶使用該應用時的效率。

7.根據目標設備調整應用資源

為盡可能高效地被載入,需要根據具體設備的配置調整相應資源,尤其是圖片資源。為使應用包文件合理適用不同設備,首先可只添加運行該應用需要的核心資源,然後再根據具體設備下載相關內容。

8.使用Hierachy Viewer可視化調試工具

Hierachy Viewer能很方便地在開發者設計,調試和調整界面時,快速定位問題,解決問題,提高開發效率。

9.使用layoutopt進行布局優化

Layoutopt是一款簡單的命令行工具,可幫助找到不必要的控制項嵌套以及縮減布局資源,從而使應用變得可能「苗條」。控制項越少、布局層次越淺,性能就越好。

10.使用Traceview及其他Android工具進行分析

Android SDK隨帶了很多用於應用分析的工具,其中最受歡迎的是Traceview,這款圖形工具可以幫助調試和找到應用中的性能瓶頸。

7. 針對Android的性能優化集中哪些方面

一、概要:

本文主要以Android的渲染機制、UI優化、多線程的處理、緩存處理、電量優化以及代碼規范等幾方面來簡述Android的性能優化

二、渲染機制的優化:

大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。

Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染, 如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。

*關於JobScheler的更多知識可以參考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html

七、代碼規范

1)for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。

2)明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)

3)合理使用數據類型,StringBuilder代替String,少用枚舉enum,少用父類聲明(List,Map)

4)如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。

5)你要知道單例的好處,並正確的使用它。

6)多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。

7)如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。

8)View中設置緩存屬性.setDrawingCache為true.

9)cursor的使用。不過要注意管理好cursor,不要每次打開關閉cursor.因為打開關閉Cursor非常耗時。Cursor.require用於刷cursor.

10)採用SurfaceView在子線程刷新UI,避免手勢的處理和繪制在同一UI線程(普通View都這樣做)

11)採用JNI,將耗時間的處理放到c/c++層來處理

12)有些能用文件操作的,盡量採用文件操作,文件操作的速度比資料庫的操作要快10倍左右

13)懶載入和緩存機制。訪問網路的耗時操作啟動一個新線程來做,而不要再UI線程來做

14)如果方法用不到成員變數,可以把方法申明為static,性能會提高到15%到20%

15)避免使用getter/setter存取field,可以把field申明為public,直接訪問

16)私有內部類要訪問外部類的field或方法時,其成員變數不要用private,因為在編譯時會生成setter/getter,影響性能。可以把外部類的field或方法聲明為包訪問許可權

17)合理利用浮點數,浮點數比整型慢兩倍

18)針對ListView的性能優化,ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動時的渲染性能。ListView中getView是性能是關鍵,這里要盡可能的優化。

getView方法中要重用view;getView方法中不能做復雜的邏輯計算,特別是資料庫操作,否則會嚴重影響滑動時的性能

19)不用new關鍵詞創建類的實例,用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。

clone()方法不會調用任何類構造函數。在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:

20)public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。

21)乘法和除法

考慮下面的代碼:

  • for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
    用移位操作替代乘法操作可以極大地提高性能。下面是修改後的代碼:
    for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }

  • 22)ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。

    23)每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費

    24)提高下載速度:要控制好同時下載的最大任務數,同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)

    25)提供載入速度:讓服務端提供不同解析度的圖片才是最好的解決方案。還有合理使用內存緩存,使用開源的框架

    引用:Android性能優化的淺談

    8. android怎樣加快ui的載入速度

    1.減小主線程的阻塞時間
    若一個操作耗時教長(超過5秒 用戶無響應5秒 網路和資料庫阻塞10秒 廣播接收者執行超過10秒會導致ANR),我們應該將其放入後台線程中執行,只在需要修改UI界面時通知主線程進行修改。
    Android已經提供了AsynTask以實現從主線程生成新的非同步任務的方法。具體用法參見非同步任務。
    2.提高Adapter和AdapterView的效率
    (1)重用已生成過的Item View
    (2) 添加ViewHolder
    (3) 緩存Item的數據
    (4)分段顯示
    3.優化布局文件
    如果我們的布局層次過多,那麼在我們用findViewById的時間必然會變多,一個變多可能不要緊,但是有很多調用必然會影響性能。

    (1) 使用觀察布局的工具 Hierarchy Viewer

    (2)使用布局優化工具: Layoutopt

    (3)優化布局的層次結構

    4.背景圖

    某些時候,我們可能希望能夠盡可能多的提高Activity哪怕一點點的性能,這時候我們可以考慮優化Activity背景圖。

    首先我們必須知道,在android的Activity中,不止有你使用的setContentView時使用的View,還包含一些其它的View。其根View是一個DecorView,你設置的View就包含在其中,id為content。

    (1)使用getWindow().setBackgroundDrawable()

    (2)自定義主題

    創建文件res/vlaues/theme.xml

    <resources>

    <style name="Theme.CustomBackground" parent="android:Theme">

    <item name="android:windowBackground">@null</item>

    </style>

    </resources>

    可根據需要將windowBackground設置為null或你需要的背景圖

    2.在<activity/>或者<application/>標簽中添加 android:theme="@style/Theme.CustomBackground"

    5.使用ViewStub

    ViewStub是一個看不見,輕量級的View。它沒有尺寸,也不會繪制以及以某種形式參與到布局中來。當只有調用Inflate之後其中的View才會被實例化,這意味著用ViewStub保留View層次結構代價是
    (1) 延遲載入不常用的UI控制項
    當某些控制項只在很少情況下才會使用,我們可以使用ViewStub來延遲載入,以提高UI載入速度及減小內存消耗。
    [java] view plain
    <span style="font-size:18px;">public class DelayLoadActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.delay_load);

    Button btn = (Button) findViewById(android.R.id.button1);
    btn.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    v.setEnabled(false);
    ViewStub stub = (ViewStub) findViewById(R.id.stub);
    View inflated = stub.inflate();
    }});
    }

    }
    </span>
    (2)提高改變布局的速度
    需要使用的場景
    界面需要頻繁切換
    希望能提高切換速度
    使用方法(以橫豎換屏為例)
    1.設置Activity的android:configChanges屬性為keyboardHidden|orientation

    2.為橫豎屏分別編寫不同的layout

    3.創建一個layout,並包含兩個ViewStub(分別對應橫豎屏)

    4.在橫豎屏,通過調用ViewStub.inflate創建當前View並將另外一個設為GONE

    5.綁定並設置控制項的狀態

    9. Android應用性能優化的內容簡介

    今天的Android應用開發者經常要想盡辦法來提升程序性能。由於應用越來越復雜,這個問題也變得越來越棘手。本書主要介紹如何快速高效地優化應用,讓應用變得穩定高效。你將學會利用Android SDK和NDK來混合或單獨使用Java、C/C++來開發應用。書中還特別講解了如下內容:
    · 一些OpenGL的優化技術以及RenderScript(Android的新特性)的基礎知識;
    · 利用SDK來優化應用的Java代碼的技巧;
    · 通過高效使用內存來提升性能的技巧;
    · 延長電池使用時間的技巧;
    · 使用多線程的時機及技巧;
    · 評測剖析代碼的技巧。
    把本書的內容學以致用,你的編程技術就會得到關鍵性的提升,寫出的應用就會更為健壯高效,從而廣受用戶好評,並最終獲得成功。
    目錄
    第1章Java代碼優化1.1Android如何執行代碼1.2優化斐波納契數列1.2.1從遞歸到迭代1.2.2BigInteger1.3緩存結果1.4API等級1.5數據結構1.6響應能力1.6.1推遲初始化1.6.2StrictMode1.7SQLite1.7.1SQLite語句1.7.2事務1.7.3查詢
    第1章Java代碼優化1.1Android如何執行代碼1.2優化斐波納契數列1.2.1從遞歸到迭代1.2.2BigInteger1.3緩存結果1.4API等級1.5數據結構1.6響應能力1.6.1推遲初始化1.6.2StrictMode1.7SQLite1.7.1SQLite語句1.7.2事務1.7.3查詢1.8總結
    第2章NDK入門2.1NDK里有什麼2.2混合使用Java和C/C++代碼2.2.1聲明本地方法2.2.2實現JNI粘合層2.2.3創建Makefile2.2.4實現本地函數2.2.5編譯本地庫2.2.6載入本地庫2.3Application.mk2.3.1為(幾乎)所有設備優化2.3.2支持所有設備2.4Android.mk2.5使用C/C++改進性能2.6本地Acitivity2.6.1構建缺失的庫2.6.2替代方案2.7總結
    第3章NDK進階3.1匯編3.1.1最大公約數3.1.2色彩轉換3.1.3並行計算平均值3.1.4ARM指令3.1.5ARM NEON3.1.6CPU特性3.2C擴展3.2.1內置函數3.2.2向量指令3.3技巧3.3.1內聯函數3.3.2循環展開3.3.3內存預讀取3.3.4用LDM/STM替換LDR/STD3.4總結
    第4章高效使用內存4.1說說內存4.2數據類型4.2.1值的比較4.2.2其他演算法4.2.3數組排序4.2.4定義自己的類4.3訪問內存4.4排布數據4.5垃圾收集4.5.1內存泄漏4.5.2引用4.6API4.7內存少的時候4.8總結
    第5章多線程和同步5.1線程5.2AsyncTask5.3Handler和Looper5.3.1Handler5.3.2Looper5.4數據類型5.5並發5.6多核5.6.1為多核修改演算法5.6.2使用並發緩存5.7Activity生命周期5.7.1傳遞信息5.7.2記住狀態5.8總結
    第6章性能評測和剖析6.1時間測量6.1.1System.nanoTime()6.1.2Debug.threadCpuTimeNanos()6.2方法調用跟蹤6.2.1Debug.startMethodTracing()6.2.2使用Traceview工具6.2.3DDMS中的Traceview6.2.4本地方法跟蹤6.3日誌6.4總結
    第7章延長電池續航時間7.1電池7.2禁用廣播接收器7.3網路7.3.1後台數據7.3.2數據傳輸7.4位置7.4.1注銷監聽器7.4.2更新頻率7.4.3多種位置服務7.4.4篩選定位服務7.4.5最後已知位置7.5感測器7.6圖形7.7提醒7.8WakeLock7.9總結
    第8章圖形8.1布局優化8.1.1相對布局8.1.2合並布局8.1.3重用布局8.1.4ViewStub8.2布局工具8.2.1層級視圖8.2.2layoutopt8.3OpenGL ES8.3.1擴展8.3.2紋理壓縮8.3.3Mipmap8.3.4多APK8.3.5著色8.3.6場景復雜性8.3.7消隱8.3.8渲染模式8.3.9功耗管理8.4總結
    第9章RenderScript9.1概覽9.2Hello World9.3Hello Rendering9.3.1創建渲染腳本9.3.2創建RenderScriptGL Context9.3.3展開RSSurfaceView9.3.4設置內容視圖9.4在腳本中添加變數9.5HelloCompute9.5.1Allocation9.5.2rsForEach9.5.3性能9.6自帶的RenderScript API9.6.1rs_types.rsh9.6.2rs_core.rsh9.6.3rs_cl.rsh9.6.4rs_math.rsh9.6.5rs_graphics.rsh9.6.6rs_time.rsh9.6.7rs_atomic.rsh9.7RenderScript與NDK對比9.8總結

    閱讀全文

    與android布局優化相關的資料

    熱點內容
    連漲啟動源碼 瀏覽:159
    小奔運動app網路異常怎麼回事 瀏覽:447
    php開啟壓縮 瀏覽:303
    伺服器主機如何設置啟動 瀏覽:282
    linux配置網路命令 瀏覽:774
    一張照片怎麼製作視頻app 瀏覽:908
    pythonweb和php 瀏覽:976
    電腦伺服器地址ip地址 瀏覽:823
    對矩陣壓縮是為了 瀏覽:910
    setfacl命令 瀏覽:172
    linux子系統中斷 瀏覽:342
    linux查看進程ps 瀏覽:224
    知識庫系統php 瀏覽:623
    小波變換壓縮圖像python 瀏覽:151
    阿里巴巴程序員怎麼月入百萬 瀏覽:173
    如何使用國外伺服器 瀏覽:188
    燃燈者pdf 瀏覽:468
    編譯器用數學嗎 瀏覽:7
    圖形化apk反編譯工具 瀏覽:48
    考勤表加密怎麼辦 瀏覽:736