0.2. android內(nèi)存泄漏逃沿,舉個例子
- 意思:該被釋放的對象沒有釋放盛嘿,一直被某個或某些實例所持有卻不再被使用導致 GC 不能回收蝇裤。
- 內(nèi)存泄漏對象的兩個特點
- 這些對象是可達的巧勤,即在有向圖中惹想,存在通路可以與其相連
- 這些對象是無用的拣凹,即程序以后不會再使用這些對象森爽。
- 常見內(nèi)存泄漏匯總
- 單例造成的內(nèi)存泄漏
- 解決辦法:getApplicationContext()
- 非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實例造成的內(nèi)存泄漏
- 解決辦法:將該內(nèi)部類設為靜態(tài)內(nèi)部類或將該內(nèi)部類抽取出來封裝成一個單例
- handler造成的內(nèi)存泄漏
- handler生命周期和handler不一致,因此這種實現(xiàn)方式一般很難保證跟 View 或者 Activity 的生命周期保持一致嚣镜,故很容易導致無法正確釋放爬迟。
- 創(chuàng)建一個靜態(tài)Handler內(nèi)部類,然后對Handler持有的對象使用弱引用菊匿,這樣在回收時也可以回收Handler持有的對象
- 單例造成的內(nèi)存泄漏
1. Activity與Fragment的生命周期
和activity類似(本本上有)
2. 四種Activity啟動方式與特點
- standard
- 默認創(chuàng)建一個新的實例付呕。
- singleTop
- 可以有多個實例,但是不允許多個相同Activity疊加
- singleTask
- 只有一個實例跌捆,若Activity不存在徽职,則會在當前task創(chuàng)建一個新的實例,若存在佩厚,則會把task中在其之上的其它Activity destory掉并調(diào)用它的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()回調(diào)方法保存臨時數(shù)據(jù)和狀態(tài),這個方法一定要在活動被回收之前調(diào)用嗜逻。
21. Android內(nèi)存優(yōu)化方法:ListView優(yōu)化涩僻,及時關閉資源,圖片緩存等等
- listview優(yōu)化
- 優(yōu)化getView()方法栈顷,不要在其中寫過多的邏輯代碼
- 使用ViewHolder逆日,減少了很多不必要的view創(chuàng)建。
- 滑動的時候不加載圖片
- 將ListView的scrollingCache和animateCache設置為false萄凤。