0.2. android內存泄漏,舉個例子
- 意思:該被釋放的對象沒有釋放,一直被某個或某些實例所持有卻不再被使用導致 GC 不能回收。
- 內存泄漏對象的兩個特點
- 這些對象是可達的,即在有向圖中,存在通路可以與其相連
- 這些對象是無用的,即程序以后不會再使用這些對象。
- 常見內存泄漏匯總
- 單例造成的內存泄漏
- 解決辦法:getApplicationContext()
- 非靜態(tài)內部類創(chuàng)建靜態(tài)實例造成的內存泄漏
- 解決辦法:將該內部類設為靜態(tài)內部類或將該內部類抽取出來封裝成一個單例
- handler造成的內存泄漏
- handler生命周期和handler不一致,因此這種實現(xiàn)方式一般很難保證跟 View 或者 Activity 的生命周期保持一致,故很容易導致無法正確釋放。
- 創(chuàng)建一個靜態(tài)Handler內部類,然后對Handler持有的對象使用弱引用,這樣在回收時也可以回收Handler持有的對象
- 單例造成的內存泄漏
1. Activity與Fragment的生命周期
和activity類似(本本上有)
2. 四種Activity啟動方式與特點
- standard
- 默認創(chuàng)建一個新的實例。
- singleTop
- 可以有多個實例,但是不允許多個相同Activity疊加
- singleTask
- 只有一個實例,若Activity不存在,則會在當前task創(chuàng)建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉并調用它的onNewIntent方法。。
- singleInstance
- 并且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。
3. Activity緩存方法。
- 有a、b兩個Activity,當從a進入b之后一段時間,可能系統(tǒng)會把a回收,這時候按back,執(zhí)行的不是a的onRestart而是onCreate方法,a被重新創(chuàng)建一次,這時a中的臨時數(shù)據(jù)和狀態(tài)可能就丟失了。
- 可以用Activity中的onSaveInstanceState()回調方法保存臨時數(shù)據(jù)和狀態(tài),這個方法一定要在活動被回收之前調用。
21. Android內存優(yōu)化方法:ListView優(yōu)化,及時關閉資源,圖片緩存等等
- listview優(yōu)化
- 優(yōu)化getView()方法,不要在其中寫過多的邏輯代碼
- 使用ViewHolder,減少了很多不必要的view創(chuàng)建。
- 滑動的時候不加載圖片
- 將ListView的scrollingCache和animateCache設置為false。