2011年4月19日 星期二

Android Avoding Memory Problem

參考網址:http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html

要避免在Android上噴出Out Of Memory(OOM),大致上有幾點要注意:
  1. 有使用Listener的話,要拿掉。文中是寫在onDestroy時拿掉(大概是在onCreate掛上的),不過我通常在onResume掛上,所以onPause就拿掉了。總之就是把握一個原則:把你掛的Listener在相對應的Life Cycle拿掉。
  2. 使用Drawable必須注意,當被加到View上時,會幫你設上一個Callback,請注意必須自己去清掉。不然會造成一個Leak在那邊,你的可用的記憶體就會越來越少,最後就Jizz了。
  3. 使用圖片時,經常需要Decode成Bitmap,如果是一張稍微大過手機最小解析度(240x320參考),那就應該考慮用先用BitmapFactory.Options將inJustDecodeBounds設為true來先Decode一次偵測圖片大小,再設定inSampleSize 縮到適合大小,再去真的Decode整張圖片n。事實上手機的解析度很有限,你把一張大圖直接塞進去也是要縮小,浪費記憶體去存大圖又容易狂噴OOM Exception
  4. 使用ListView Adapter,將getView傳進的convertView重複利用,既能減少記憶體的用量,也不會每次new一個新的View減慢速度。
  5. 將大的物件在onDestroy時設為null,或許可以加快GC選到的機會,但是如果還有其他Thread在跑,則很容易出現NullPointerException,請小心使用。
  6. 使用不屬於需要長時間存在的Thread必須能夠在Activity停掉時跟著停掉,不然會造成整個Activity無法被GC回收。

沒有留言:

張貼留言