android中的記憶體洩露與優化有很多方面
例如:資料庫cursor
沒有關閉
註冊機制造成的記憶體洩露
輸入/輸出流沒有關閉
context造成的記憶體洩露
adapter中沒有快取
convertview
bitmap物件沒有使用
recycle
進行釋放
集合中的資料沒有及時釋放
handle的記憶體洩露
findviewbyid等等問題
context的記憶體洩露
例如:在activity
中啟動執行緒
service
或者其他有自己宣告週期的物件持有
activity
的引用等等
在activity
activity
中直接啟動乙個執行緒 那麼此時執行緒就持有了
activity
activity
是不能被銷毀的 如果我們頻繁的啟動退出該
activity
就會造成記憶體的不斷洩露 最終導致
oom
解決方案 將執行緒內部類改為static
外部引用activity
的context
此時只要外部這個物件沒有被銷毀
activity
就不能被銷毀 造成持續的記憶體洩露 的
context
代替activity
中的context
或者在引用
context
的時候使用
weakreference
(弱引用)
adapter中沒有使用
convertview
在adapter
中 每載入乙個
item
就會執行一次
getview
方法 如果在
getview
方法中 不使用
convertview
進行快取的話 每載入乙個
item
就要重新解析一次
layout
布局檔案 耗時又浪費系統資源
adapter的
getview
方法中為我們提供了
convertview
即當listview
中最上邊的
item
移出螢幕時 系統會將該
view
進行分類** 以備我們進行重用 當我們使用
convertview
時 就會大大減少解析
xml檔案浪費的時間 同時又盡可能少的佔據系統資源 在使用
convertview
的同時 應當使用
viewholder
注意使用
convertview
和使用viewholder
是不同的 使用
convertview
是為了減少解析
xml檔案浪費的時間 而使用
viewholder
是為了減少
findviewbyid
浪費的時間
bitmap物件
bitmap物件是非常佔據系統資源的 現在的手機 數位相機畫素越來越高 照出來的**也是越來越大
2-3m
是平常 如果我們在程式中不對這樣的進行處理的話 一張**就可以讓我們的程式直接
oom
通常 我們在使用bitmap
顯示的時候 都會對進行壓縮處理 載入大的時候 先載入的邊界 再根據手機的畫素對進行壓縮處理 批量載入小的時候 在對進行壓縮的同時 還要對存放的集合使用
weakreference
同時在bitmap
使用完畢之後
recycle()
進行釋放 將
bitmap
占用的畫素資源釋放
handler的記憶體洩露問題
在activity
中我們經常會使用
handler
處理一些事件 經常在**中會這麼寫
private handler handler = new handler(){
public void onhandlermessage(){
在activity
中我們經常這麼寫 那麼此時
handler
是乙個匿名內部類 會持有
activity
的引用 而伴隨著
handler
的經常是乙個耗時操作 例如從網路中獲取內容 或者是乙個延遲處理的訊息 如果是聯網獲取內容 如果我們在聯網的過程中關閉了
activity
此時的activity
handler
的引用(
因為執行緒在執行完畢之後需要傳送訊息給
handler
處理)
而handler
又持有activity
的引用 此時就會造成記憶體洩露 同樣 如果是乙個延時訊息的話
handler
會在messagequeue
中放入乙個
message
等待處理 此時
messagequeue
會持有looper
的引用
looper
會持有handler
的引用
handler
又會持有
activity
的引用 在
message
的delay
到來之前
activity
是不能被銷毀的
如果此時頻繁的啟動銷毀該activity
就會oom
解決方案 可以在activity
銷毀時停止執行緒 並且呼叫
handler
的removecallback
方法 將訊息佇列中的訊息移出 或者將
handler
置為static
但是將handler
置為static
時 handler
就不能進行
ui的更新操作 那麼此時就需要在
handler
中宣告乙個
activity
的weakreference
供handler
進行使用
android中ImageView的記憶體問題
大家都知道bitmap的記憶體問題往往是乙個安卓應用的最大oom問題。好多同學也知道可以通過bitmap.recycle 方法 的記憶體。可是往往會在 後出現try to use recyled bitmap的bug。這個是因為我們 了的bitmap還有其他地方在使用的原因.這裡給出乙個解決方案。沒...
android中ImageView的記憶體問題
大家都知道bitmap的記憶體問題往往是乙個安卓應用的最大oom問題。好多同學也知道可以通過bitmap.recycle 方法 的記憶體。可是往往會在 後出現try to use recyled bitmap的bug。這個是因為我們 了的bitmap還有其他地方在使用的原因.這裡給出乙個解決方案。沒...
android中記憶體洩漏和記憶體溢位的區別
記憶體洩漏是指分配出去的記憶體無法 了 記憶體洩漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。一般我們常說的記憶體洩漏是指堆記憶體的洩漏。堆記憶體是指程式從堆中分配的,大小任意的 記憶體塊的大...