android中的記憶體問題(一)

2021-07-05 13:11:22 字數 3173 閱讀 7107

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中記憶體洩漏和記憶體溢位的區別

記憶體洩漏是指分配出去的記憶體無法 了 記憶體洩漏指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況,是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。一般我們常說的記憶體洩漏是指堆記憶體的洩漏。堆記憶體是指程式從堆中分配的,大小任意的 記憶體塊的大...