Android十大常用技術揭祕-挑戰

Android四大組件

http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html

 

三級緩存

可以用我們上課講的說

也可以參照

http://blog.saymagic.cn/2015/01/30/android-pic-three-cache.html

 

圖片的處理和優化

http://www.cnblogs.com/elliotta/p/3633752.html

http://blog.csdn.net/yudajun/article/details/9323941

 

Android5.0新特性

技術方面說明

http://blog.csdn.net/lwyygydx/article/details/41870377

功能改進方面說明

http://digi.tech.qq.com/a/20150121/012030.htm

 

圖文混排

可以參照李延磊老師的

也可以參照鏈接

http://blog.csdn.net/fancylovejava/article/details/39927539

 

第三方框架:xUtils,Gson  極光推送 第三方登錄

xUtils,Gson  極光推送 都講過,忽略

友盟第三方登錄

http://blog.umeng.com/uncategorized/4160.html

 

第三方登錄案例

http://blog.csdn.net/yueqinglkong/article/details/15028041

 

 

線程池

http://blog.csdn.net/lyf_007217/article/details/8542238

http://www.cnblogs.com/devinzhang/p/3856200.html

 

lru算法底層

http://www.360doc.com/content/14/0402/09/10504424_365635496.shtml

http://blog.csdn.net/androidzhaoxiaogang/article/details/7910364

 

ListView的局部刷新

http://www.2cto.com/kf/201409/335964.html

http://blog.csdn.net/u200814499/article/details/40391443

 

及時通訊

http://blog.csdn.net/jiangliloveyou/article/details/9849775

http://blog.csdn.net/lnb333666/article/details/7471292

http://skywen.iteye.com/blog/1811310

 

百度地圖

已經講了,請看視頻

Handler消息機制

已經講了,請看視頻

AsyncTask

已經講了,請看視頻

GC原理

http://blog.csdn.net/wuqiong_524itcast/article/details/25378685

http://blog.csdn.net/wangshione/article/details/8490245

http://blog.csdn.net/lnb333666/article/details/8031770

 

1.垃圾收集算法的核心思想

Java語言建立了垃圾收集機制,用以跟蹤正在使用的對象和發現並回收不再使用(引用)的對象。該機制可以有效防範動態內存分配中因內存垃圾過多而引發的內存耗盡,以及不恰當的內存釋放所造成的內存非法引用。

 垃圾收集算法的核心思想是:對虛擬機可用內存空間,即堆空間中的對象進行識別,如果對象正在被引用,那麼稱其爲存活對象,反之,如果對象不再被引用,則 爲垃圾對象,可以回收其佔據的空間,用於再分配。垃圾收集算法的選擇和垃圾收集系統參數的合理調節直接影響着系統性能,因此需要開發人員做比較深入的瞭解。

  1. 觸發主GC(Garbage Collector)的條件

 JVM進行次GC的頻率很高,但因爲這種GC佔用時間極短,所以對系統產生的影響不大。更值得關注的是主GC的觸發條件,因爲它對系統影響很明顯。總的來說,有兩個條件會觸發主GC:

  ①當應用程序空閒時,即沒有應用線程在運行時,GC會被調用。因爲GC在優先級最低的線程中進行,所以當應用忙時,GC線程就不會被調用,但以下條件除外。

  ②Java堆內存不足時,GC會被調用。當應用線程在運行,並在運行過程中創建新對象,若這時內存空間不足,JVM就會強制地調用GC線程,以 便回收內存用於新的分配。若GC一次之後仍不能滿足內存分配的要求,JVM會再進行兩次GC作進一步的嘗試,若仍無法滿足要求,則 JVM將報“out of memory”的錯誤,Java應用將停止。

3.減少GC開銷的措施

根據上述GC的機制,程序的運行會直接影響系統環境的變化,從而影響GC的觸發。若不針對GC的特點進行設計和編碼,就會出現內存駐留等一系列負面影響。爲了避免這些影響,基本的原則就是儘可能地減少垃圾和減少GC過程中的開銷。具體措施包括以下幾個方面:

  (1)不要顯式調用System.gc()

  此函數建議JVM進行主GC,雖然只是建議而非一定,但很多情況下它會觸發主GC,從而增加主GC的頻率,也即增加了間歇性停頓的次數。

  (2)儘量減少臨時對象的使用

  臨時對象在跳出函數調用後,會成爲垃圾,少用臨時變量就相當於減少了垃圾的產生,從而延長了出現上述第二個觸發條件出現的時間,減少了主GC的機會。

  (3)對象不用時最好顯式置爲Null

  一般而言,爲Null的對象都會被作爲垃圾處理,所以將不用的對象顯式地設爲Null,有利於GC收集器判定垃圾,從而提高了GC的效率。

  (4)儘量使用StringBuffer,而不用String來累加字符串(詳見blog另一篇文章JAVA中String與StringBuffer)

  由於String是固定長的字符串對象,累加String對象時,並非在一個String對象中擴增,而是重新創建新的String對象,如 Str5=Str1+Str2+Str3+Str4,這條語句執行過程中會產生多個垃圾對象,因爲對次作“+”操作時都必須創建新的String對象,但 這些過渡對象對系統來說是沒有實際意義的,只會增加更多的垃圾。避免這種情況可以改用StringBuffer來累加字符串,因StringBuffer 是可變長的,它在原有基礎上進行擴增,不會產生中間對象。

  (5)能用基本類型如Int,Long,就不用Integer,Long對象

  基本類型變量佔用的內存資源比相應對象佔用的少得多,如果沒有必要,最好使用基本變量。

  (6)儘量少用靜態對象變量

  靜態變量屬於全局變量,不會被GC回收,它們會一直佔用內存。

  (7)分散對象創建或刪除的時間

  集中在短時間內大量創建新對象,特別是大對象,會導致突然需要大量內存,JVM在面臨這種情況時,只能進行主GC,以回收內存或整合內存碎片, 從而增加主GC的頻率。集中刪除對象,道理也是一樣的。它使得突然出現了大量的垃圾對象,空閒空間必然減少,從而大大增加了下一次創建新對象時強制主GC 的機會。

 

 

gc()函數的作用只是提醒虛擬機:程序員希望進行一次垃圾回收。但是它不能保證垃圾回收一定會進行,而且具體什麼時候進行是取決於具體的虛擬機的,不同的虛擬機有不同的對策。在Davilk中,給程序分配的內存是根據機型廠商的不同而不同(現在大部分爲32MB),在VM內部會將內存分爲:java使用的內存,Native使用的內存,他們之間不能共享,當某一方面不足

的時候必須向VM申請,而不能直接使用另外一個的內存。

出現內存泄漏的可能性:

出現情況:
1. 數據庫的cursor沒有關閉

2.構造adapter時,沒有使用緩存contentview
  衍生listview的優化問題-----減少創建view的對象,充分使用contentview,可以使用一靜態類來優化處理getview的過程

3.Bitmap對象不使用時採用recycle()釋放內存

4.activity中的對象的生命週期大於activity
調試方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

 

 

Android 內存淺析【管理、機制、分析】

一、 Android的內存機制

Android的程序由Java語言編寫,所以Android的內存管理與Java的內存管理相似。程序員通過new爲對象分配內存,所有對象在java 堆內分配空間;然而對象的釋放是由垃圾回收器來完成的。C/C++中的內存機制是“誰污染,誰治理”,java的就比較人性化了,給我們請了一個專門的清 潔工(GC)


二、GC是什麼? 爲什麼要有GC?    
    GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以 自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

 

  • 垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收? 
        對於GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有對 象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象爲"不可達"時,GC就有責任回收這些內存空間。可以。程序員可 以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。

 

間而忘記了釋放。如果程序中存在對無用對象的引用,那麼這些對象就會駐留內存,消耗內存,因爲無法讓垃圾回收器GC驗證這些對象是否不再需要。如果存在對 象的引用,這個對象就被定義爲"有效的活動",同時不會被釋放。要確定對象所佔內存將被回收,我們就要務必確認該對象不再會被使用。典型的做法就是把對象 數據成員設爲null或者從集合中移除該對象。但當局部變量不需要時,不需明顯的設爲null,因爲一個方法執行完畢時,這些引用會自動被清理。

Java帶垃圾回收的機制,爲什麼還會內存泄露呢?舉例:

[java] view plaincopyprint?

  1. Vector v = new Vector(10);  
  2.         for (int i = 1; i < 100; i++) {  
  3.             Object o = new Object();  
  4.             v.add(o);  
  5.             o = null;  
  6.         }// 此時,所有的Object對象都沒有被釋放,因爲變量v引用這些對象。  

Java 內存泄露的根本原因就是 保存了不可能再被訪問的變量類型的引用

六、Android的內存溢出
        Android的內存溢出是如何發生的?
        Android的虛擬機是基於寄存器的Dalvik,它的最大堆大小一般是16M,有的機器爲24M。也就是說我們所能利用的內存空間是有限的。如果我們的內存佔用超過了一定的水平就會出現OutOfMemory的錯誤。
爲什麼會出現內存不夠用的情況呢?我想原因主要有兩個:
由於我們程序的失誤,長期保持某些資源(如Context)的引用,造成內存泄露,資源造成得不到釋放。保存了多個耗用內存過大的對象(如Bitmap),造成內存超出限制。

 

 

在Android適配方案小結

  • 、(二)中,我們瞭解了一些基本概念。

600dp的含義是:代表這個設備的最短的那一邊。

獲取設備的最短邊的代碼是:Configuration config = getResources().getConfiguration();

int smallestScreenWidth = config.smallestScreenWidthDp;

這個時候拿smallestScreenWidth 與600想比較就可以知道該設備能否讀取裏面的資源了。

) 

 

除此之外,爲了方便適配,在編碼時我們還應該注意什麼呢,主要有以下幾點:

(1)多使用權重(android:layout_weight)

尤其是在tab切換佈局,listview title及Item佈局等情況下;
(2)設置寬度和高度時,儘量使用match_parent和wrap_content,避免把控件寬高設死;
(3)父容器佈局選用
多使用RelativeLayout,FrameLayout,GridLayout等,減少佈局層次。當然,在使用
權重時,得采用LinearLayout;
(4) 在xml裏,設置高度、寬度採用dp(dip),設置字體採用sp。

(應該注意,在代碼裏面,我們寫的setHeight(...)單位是px)


  • 那麼在具體開發中,我們應該注意什麼呢。
    首先,我們必須要知道,其實適配的關鍵在於兩點:
    (1)不同分辨率設備的適配,這點在單位的使用上用dp、sp以及圖片資源存放於不同的drawable文件夾就可以解決問題;
    (2)不同尺寸的適配,這點主要靠將相關值以及佈局文件放置於不同的文件夾中來解決。
    2.1 values文件夾
    可以在工程下創建不同的values文件夾:values-sw480dp, values-sw600dp, 
    values-sw720dp-land等。比如一個控件的寬度,在10寸pad上是10dp,在8寸pad
    上是5dp。這時,你可以定義一個變量,button_width,然後在values-sw600dp
    下寫5dp,在values-sw720-land下寫
    10dp。這樣就達到了在不同尺寸pad上,
    相應控件大小不一樣的效果。
    2.1 layout文件夾
    如果在不同尺寸設備上展示的佈局有明顯差別,僅僅用values不同已經難以控制,
    那麼就可以考慮寫不同的佈局文件置於不同的layout文件夾下,android會根據設備
    尺寸去加載相應文件夾下的佈局文件。如:layout-sw480dp,layout-sw600dp,
    layout-sw700dp等。
    值得注意的是,如果不是很有必要,儘量採用2.1方案,方便維護。如果尺寸和分辨率都不同,
    那麼就要結合(1)、(2)考慮了。

(補充:其實values文件夾和layout文件夾不僅僅是根據尺寸判斷,也和分辨率有關,不過在通常情況下,

綜合計算考慮,僅根據尺寸判斷就可以了:

發佈了144 篇原創文章 · 獲贊 18 · 訪問量 74萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章