1. 程式人生 > >Android軟體開發中常見的幾個瓶頸

Android軟體開發中常見的幾個瓶頸

Android軟體開發中常見的幾個瓶頸

不同解析度適配

不同版本除錯

語言?效能?觸控?動畫?

記憶體,記憶體,記憶體...

Android軟體記憶體限制

Android系統對每個軟體所能使用的RAM空間進行了限制(: Nexus one 對每個軟體的記憶體限制是24M)

Java語言本身比較消耗記憶體

dalvik虛擬機器也要佔用一定的記憶體空間

OOM功臣—Bitmap

當在Android手機上直接讀取4M的圖片時,死神一般都會降臨

往往自己手機拍攝的照片都不能直接讀取

OOM功臣—Bitmap

技巧:讀取圖片之前先檢視其大小

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inJustDecodeBounds = true;

Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

使用得到的圖片原始寬高計算適合自己的smaplesize

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inSampleSize = 4;

Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);

OOM功臣—Bitmap

對於過時的Bitmap物件一定要及時recycle

並且把此物件賦值為null

bitmap.recycle();

bitmap = null; 

View優化

使用9patch格式的圖片資源

使用png圖片壓縮工具對9patch格式圖片壓縮

使用-land, -mdpi, -hdpi等作為layout和當然啊wable的字尾,來做圖片適應和不同解析度適配

View優化

使用layoutopt進行優化

$ layoutoptsamples/ samples/compound.xml

The root-level <FrameLayout/> can be replaced with <merge/>

This LinearLayoutlayout or its FrameLayoutparent is useless samples/simple.xml

The root-level <FrameLayout/> can be replaced with <merge/> samples/too_deep.xml

This layout has too many nested layouts: 13 levels, it should have <= 10!

參考http://android-developers.blogspot.com/2009/11/optimize-your-layouts.html

減少邏輯程式碼工作量

class MyActivityextends Activity {

public void myClickHandler(View v) {

// Do stuff

} }

Layout xml檔案中加入:

<Button android:onClick="myClickHandler" />

即可實現不在程式碼中新建OnClickListener

使用最少的View

LinearLayoutxmlns:android=“http://schemas.android.com/apk/res/android” android:layout_width=“fill_parent” android:layout_height=“?android:attr/listPreferredItemHeight” android:padding=“6dip”>

 <ImageViewandroid:id=“@+id/icon” android:layout_width=“wrap_content” android:layout_height=“fill_parent” android:layout_marginRight=“6dip” android:src=“@drawable/icon” />

<LinearLayoutandroid:orientation=“vertical” android:layout_width=“0dip” android:layout_weight=“1” android:layout_height=“fill_parent”>

<TextViewandroid:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:gravity="center_vertical" android:text="My Application" />

<TextViewandroid:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:singleLine="true" android:ellipsize="marquee" android:text="Simple application that shows how to use RelativeLayout" />

 </LinearLayout>

 </LinearLayout>

去掉不必要的View

<resources>

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

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

</resources>

Manifest.xmlActivityApplication中新增android:theme="@style/Theme.NoBackground"

減小圖片大小

res/drawable/background_shelf.xml中使用:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" android:src="@drawable/shelf_panel" android:tileMode="repeat" />

使用Stub

A ViewStub is an invisible, zero-sized View that can be used to lazily inflate layout resources at runtime

<ViewStub android:id="@+id/stub" android:inflatedId="@+id/subTree"   android:layout="@layout/mySubTree" android:layout_width="120dip" android:layout_height="40dip" />

 ViewStub stub = (ViewStub) findViewById(R.id.stub);

 View inflated = stub.inflate();

程式碼級記憶體優化

 Android提供了很健全的訊息傳遞機制(Intent)和任務模型(Handler),可以通過傳遞或事件的方式,防止一些不必要的全域性變數

對於很多必不可少的全域性引用,如果不是隨時需要或者必不可少,則可以使用SoftRerence 或者 WeakRerence引用他們,可以保證在系統記憶體不足的時候,他們會首先釋放而不是出現OOM

如果有牽涉到大量物件或者組合資料的演算法操作,則最好使用C語言封裝這些物件並進行操作,通過jni呼叫至於java語言進行最簡單的資料通訊。因為即使空的JAVA語言物件也會佔據20多個位元組

Android軟體效能優化淺談

Android效能殺手:

1. GC, 系統GC之低效

2. layout佈局和view顯示

3. load圖片和檔案讀取

Android軟體效能優化淺談

提升效能的幾點技巧:

1. 減少臨時物件的頻繁生成和銷燬

2. 使用ViewStub延遲載入某些比較複雜的layout

3. 迴圈或者多層迴圈內的操作儘可能簡單,更能享受jit帶來的加速

4. 佔用CPU較多的資料操作儘可能放在一個單獨的執行緒中進行,通過handler等方式把執行的結果交於UI執行緒顯示

小結

Android系統中處處可見生命週期的使用,包括activityview等等。此種做法線上程同步等方面有很積極的意義,並且對程式執行的階段有很清晰的劃分。

我們只要嚴格按照Android程式執行的生命週期,在處理記憶體消耗型任務時,使用壓縮,緩衝和流等方式,在處理cpu消耗型任務時採用額外執行緒處理,UI執行緒展示的方式,就可以在編寫Android程式時避免很多古怪的問題。

相關推薦

Android軟體開發常見瓶頸

Android軟體開發中常見的幾個瓶頸 不同解析度適配 不同版本除錯 語言?效能?觸控?動畫? 記憶體,記憶體,記憶體... Android軟體記憶體限制 Android系統對每個軟體所能使用的RAM空間進行了限制(如: Nexus one 對每個軟體的記憶體限制是24M) Java語言本身比較消耗記憶體

列出軟體開發常見的設計模式並解釋

設計模式主要分三個型別:建立型、結構型和行為型。 其中建立型有: 一、Singleton,單例模式:保證一個類只有一個例項,並提供一個訪問它的全域性訪問點 二、Abstract Factory,抽象工廠:提供一個建立一系列相關或相互依賴物件的介面

軟體開發常見的十大系統瓶頸

在Zen And The Art Of Scaling - A Koan And Epigram Approach中,Russell Sullivan提出了一個非常有趣的總結:軟體開發常見的20個傳統的系統瓶頸,這聽起來像是說有20個故事情節,並且依賴於你如何策劃這些故事,

淺析Android Camera開發的三尺寸和三種變形 貢獻一個自適配Picturesize和Previewsiz

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

日常開發常用跨域處理方式

geo htm 網站 options https ss代理 write npm 服務端 設置express代理請求 在基於vue-cli的項目中,在開發環境配置(config/dev.env.js)中設置代理,能夠將所有/apidomain開頭的請求都通過npm run d

軟體開發常見開發模型

軟體開發模型是指軟體開發全部過程、活動和任務的結構框架。軟體開發包括需求、設計、編碼和測試等階段,有時也包括維護階段。軟體開發模型能清晰、直觀地表達軟體開發全過程,明確規定了要完成的主要活動和任務,用來作為軟體專案工作的基礎。對於不同的軟體系統,可以採用不同的開

軟體開發人員的階段思考和總結

     6程式碼閱讀能力,中級開發人員有一定的程式碼閱讀能力,否則他無法和其他開發人員進行聯合開發和聯合除錯,但中級程式碼人員缺乏的是快速閱讀能力,和其他語言的閱讀能力(指那些未學習過的語言)。所以中級技術人員最怕開發平臺的變化。      說了這麼多。關於中級技術人員說一點自己的的看法。中級技術人員是一

JS開發彰顯水準的技巧

1.使用requestAnimationFrame JavaScript建立動畫時使用requestAnimationFrame幀動畫,它很類似於setTimeOut函式,並且當標籤頁失去焦點時,它就不再執行  一般用法: function render(){ //TODO requestAnimati

vue.js2.0開發技巧

       最近用Vue.js開發了幾個專案,Vue的雙向資料繫結和元件化讓我耳目一新,減少了很多底層重複的工作,和基於jQuey的前端開發不起來,基於Vue的開發給我一種酣暢淋漓的感覺。    

Android嵌入式開發初學者的注意點

    一:首先你必須瞭解ARM平臺 Android 移植與驅動核心開發,當然也可以是X86和其他的平臺,不過其他平臺的Android智慧終端開發並不是很多。 Android嵌入式智慧作業系統是基於Linux核心和驅動的,對於HTC、華為等公司開發Android作業系統時,需要專門

Android Studio開發遇到的問題及其解決方法

1.建立虛擬機器後,執行時出現錯誤對話方塊,錯誤內容如下: KVM is required to run this AVD. /dev/kvm is not found. Enable VT-x in your BIOS security settings, ensure

簡單區分軟體開發概念:C/S結構和B/S結構、三層結構和兩層結構、MVC和三層架構

C/S——客戶端/服務端,簡單講就是客戶端電腦上需要安裝專有的軟體來更伺服器交流,就像QQ。主要通過訊息的機制傳遞(當然也可以自己寫協議,遊戲就是這樣做的。) B/S——瀏覽器/服務端,你只要有瀏覽器就可以與伺服器進行通訊,不用再安裝專門的客戶端,通訊協議使用HTTP協議.

歸納AOP在Android開發常見用法

AOP 是什麼 在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,是函數語言程式設計的一種衍生範型。利用

android開發——Android開發的47小知識

環境 底部 枚舉 目前 mount ram 啟動 creat ica 1、判斷sd卡是否存在 boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environm

kafka常見問題

#kafka中的幾個常見問題 V1版 1,每個topic的分割槽中有多個segment,一個分割槽會被分成相同大小資料數量不等的segment,資料的生命週期就是指的是segment的生命週期 2,資料的儲存機制: 首先是Broker接受到資料,將資料放到作業系統的快取裡,(page

Android應用開發三種常見的圖片壓縮方法

Android應用開發中三種常見的圖片壓縮方法,分別是:質量壓縮法、比例壓縮法(根據路徑獲取圖片並壓縮)和比例壓縮法(根據Bitmap圖片壓縮)。 一、質量壓縮法 private Bitmap compressImage(Bitmap image) { ByteArrayOutput

ViewPager+Fragment使用常見問題總結

1.實現迴圈切換 思路一:在ViewPager的Adapter中返回count的值為 Integer.MAX_VALUE ,進行初始化的時候講ViewPager的 setCurrentItem(int item) 的方法中傳入Integer.MAX_VALUE的一箇中間值,因為Int

Android開發常見記憶體洩漏問題

##一、記憶體洩漏原因 當一個物件不再使用時,本該被回收,而另一個正在使用的物件持有它的引用導致不能被回收,就產生了記憶體洩漏。 ##二、記憶體洩漏的影響 Android系統為每個應用程式分配的記憶體有限,當應用中記憶體洩漏較多時,輕則造成可用空間不足,頻繁發生gc,表現為應用執行卡

Android開發常見的設計模式

對於開發人員來說,設計模式有時候就是一道坎,但是設計模式又非常有用,過了這道坎,它可以讓你水平提高一個檔次。而在android開發中,必要的瞭解一些設計模式又是非常有必要的。對於想系統的學習設計模式的同學,這裡推薦2本書。一本是Head First系列的Head Hirs

軟體開發的注意事項(常見問題整理)

一、函式定義原則 1、一個函式/方法只做一件事情,不能將多個事情放在一個函式中處理(單一職責原則 SRP) 函式/方法的最小粒度是功能,函式在設計/定義的時候,不能將多個功能柔進一個函式裡面,這樣函式會變得得膨脹,增加了函式的耦合性,不便於函式管理維護。 例如,有這麼一個業務邏輯:使用者每天來網站閱