亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

解決Android平臺中應用程序OOM異常的方法

2020-04-11 11:11:17
字體:
來源:轉載
供稿:網友

在Android平臺上面,應用程序OOM異常永遠都是值得關注的問題。通常這一塊也是程序這中的重點之一。這下我就如何解決OOM作一點簡單的介紹。

首先,OOM就是內存溢出,即Out Of Memory。也就是說內存占有量超過了VM所分配的最大。

怎么解決OOM,通常OOM都發生在需要用到大量內存的情況下(創建或解析Bitmap,分配特大的數組等),在這樣的一種情況下,就可能出現OOM,據我現在了解到,多數OOM都是因為Bitmap太大。所以,這里我就專門針對如何解決Bitmap的OOM。其實最核發的就是只加載可見范圍內的Bitmap,試想這樣一種情況,在GridView或ListView中,數據量有5000,每一屏只顯示20個元素,那么不可見的,我們是不需要保存Bitmap在內在中的。所以我們就是只把那么可見的Bitmap保留在內存中,那些不可見的,就釋放掉。當元素滑出來時,再去加載Bitmap。

這里我有兩種方式,都可以避免OOM。

一、主動釋放Bitmap的內存
這種方式我簡單說一下,不太推薦,這也是我最開始使用的一種方法,但最后證明它不是最好的。(不推薦)

它的本質思路是:
  1、只加載可見區域的Bitmap

  2、滑動時不加載

  3、停止滑動(Idle)后,開始重新加載可見區域的圖片

  4、釋放滑出可見區域的Bitmap的內在。

它比較復雜:
    1、我們需要監聽GridView/ListView的滑動事件,這個很簡單做到,AbsListView#setOnScrollListener(OnScrollListener l)

    2、主動調用Bitmap#recycle()方法,它會導致一個問題,必須判斷這個Bitmap是否被一個View(ImageView等)所引用,如果被引用,我們不能簡單地調用recycle()方法,這樣會導致異常,說是View使用了一個已經被回收的Bitmap。

    3,我們必須設計自己的線程來控制開始/暫停等,因為GridView/ListView的滑動狀態可能不斷地變化,也就是說滑動->停止->滑動,這種狀態可能不斷變化,這樣就會導致我們的線程中的run()方法里面的邏輯比較復雜,一旦復雜,問題就可能就得更多。

基于以上幾點,這種方式不是最好的,所以不推薦。

二、設計Cache
    這種方式,我覺得是比較好的一種,它首先利用了cache,我認為cache是一個很重要的東西,把Bitmap的內存單獨放在一個地方來管理,這個地方就是cache,它的容量是一定的,我們可能會不斷的向這個cache中添加元素,也可能不斷的移除元素。

為了更好的說明這種方式,先要介紹一下LruCache。

LruCache
    1、這其實就是一個LinkedHashMap,任意時刻,當一個值被訪問時,它就會被移動到隊列的開始位置,所以這也是為什么要用LinkedHashMap的原因,因為要頻繁的做移動操作,為了提高性能,所以要用LinkedHashMap。當cache滿了時,此時再向cache里面添加一個值,那么,在隊列最后的值就會從隊列里面移除,這個值就有可能被GC回收掉。

    2、如果我們想主動釋放內存,也是可以的,我們可以重寫entryRemoved(Boolean, K, V, V)方法。

    3、這個類是線程安全的,在多線程下面使用這個類,沒不會存在問題。

synchronized (cache) {    if (cache.get(key) == null) {      cache.put(key, value);   }} 

    4、LruCache的APILevel是12,也就是說,我們在SDK 2.3.x以下是無法使用的,但是沒關系,LruCache的源碼不算復雜,我們可以直接把它拷貝到自己的工程目錄就可以了。
 AsyncTask<>
    這個類也是一個很重要也很常用的類。它封裝了Thread和Handler,我們使用就更加方便,不用關注Handler,我們知道,在后臺線程中是不能更新UI,而很多情況下,我們在后臺線程做完一件事情后,一般都會更新UI,一般的做法是向關聯到UI線程的Handler發送一個message,在Handler里面去處理這個message,從而更新UI。用了AsyncTask之后,我們就不用關注Handler了。這個類有幾個重要的方法:

    1)、onPreExecute(): 在UI線程里面調用,它在這個task執行后會立即調用。我們在這個方法里面通常是用于建立一個任務,比如顯示一個等待對話框來通知用戶。

    2)、doInBackground(Params...):這個方法從名字就可以看出,它是運行在后臺線程的,在這個方法里面,去做耗時的事情,比如下載訪問網絡,操作文件等。這這個方法里面,我們可以調用publishProgress(Progress...)來調用當前任務的進度,調用了這個方法后,對應的onProgressUpdate(Progress...)方法會被調用,這個方法是運行在UI線程的。

    3)、onProgressUpdate(Progress...):運行在UI線程,在調用publishProgress()方法之后。這個方法用來在UI上顯示任何形式的進度,比如你可以顯示一個等待對話框,也可以顯示一個文本形式的log,還可以顯示toast對話框。

    4)、onPostExecute(Result):當task結束后調用,它運行在UI線程。

    5)、取消一個task,我們可以在任何時候調用cancel(Boolean)來取消一個任務,當調用了cancel()方法后,onCancelled(Object)方法就會被調用,onPostExecute(Object)方法不會被調用,在doInBackground(Object[])方法中,我們可以用isCancelled()方法來檢查任務是否取消。

    6)、幾點規則

AsyncTask實例必須在UI線程中創建  
execute(Params...)方法必須在UI線程中調用。
不用手動調用onPreExecute(), onPostExecute(), doInBackground(), onProgressUpdate()方法。
一個任務只能被執行一次。 
總的思路
    1、始終從cache中去取Bitmap,如果取到Bitmap,就直接把這個Bitmap設置到ImageView上面。

    2、如果緩存中不存在,那么啟動一個task去加載(可能從文件來,也可能從網絡)。

    3、每一個ImageView上面都可能綁定一個task,所以,這個ImageView必須提供一個方法能得到與之相關聯的task,為什么要這樣做?因為在給一個ImageView綁定task之前,必須要把原先的task取消。

以上就是解決應用程序OOM異常的方法,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人狂躁日本妞一区二区三区| 日韩中文字幕免费视频| 一夜七次郎国产精品亚洲| 91九色国产视频| 亚洲国产精品va| 丝袜美腿精品国产二区| 成人综合国产精品| 久久夜色精品国产| 懂色av中文一区二区三区天美| 日韩成人av在线播放| 91久久精品国产| 欧洲亚洲在线视频| 精品久久久中文| 国产97在线|日韩| 乱亲女秽乱长久久久| 国产欧美精品在线| 精品久久久一区二区| 国产精品成人国产乱一区| 国产专区精品视频| 欧美日韩亚洲国产一区| 97高清免费视频| 欧美日本高清一区| 日韩小视频在线| 亚洲天堂2020| 国产aaa精品| 亚洲奶大毛多的老太婆| 成人在线视频网站| 亚洲老头同性xxxxx| 伊人久久久久久久久久| 九色精品免费永久在线| 久久精品成人欧美大片| 按摩亚洲人久久| 国产精品最新在线观看| 91精品啪aⅴ在线观看国产| 国产精品一香蕉国产线看观看| 亚洲欧美日韩国产中文专区| 国产成人一区二区在线| 亚洲第一网站男人都懂| 久久久久久久久综合| 中国人与牲禽动交精品| 亚洲欧美国产精品va在线观看| 久热精品视频在线观看| 日韩电影免费观看在线| 亚洲天堂色网站| 亚洲综合一区二区不卡| 色伦专区97中文字幕| 亚洲欧美日韩爽爽影院| 精品久久久久久中文字幕大豆网| 九九精品视频在线观看| 国产97在线|日韩| 欧美精品在线观看| 国产精品视频yy9099| 色爱av美腿丝袜综合粉嫩av| 一区二区欧美日韩视频| 97香蕉超级碰碰久久免费软件| 久久久精品久久久久| 日韩一区二区福利| 在线观看91久久久久久| 97视频在线观看播放| 91精品久久久久久久| 日本欧美中文字幕| 一本一道久久a久久精品逆3p| xvideos亚洲| 色偷偷av亚洲男人的天堂| 亚洲2020天天堂在线观看| 亚洲男人天堂2023| 精品视频久久久久久久| 一区二区三区四区在线观看视频| 欧美视频13p| 亚洲欧美一区二区三区情侣bbw| 亚洲国产精品美女| 久久精品电影网站| 亚洲精品自在久久| 亚洲社区在线观看| 色爱精品视频一区| 免费99精品国产自在在线| 精品一区二区三区电影| 色综合伊人色综合网站| 国产综合香蕉五月婷在线| 色噜噜狠狠色综合网图区| 精品二区三区线观看| 色偷偷91综合久久噜噜| 亚洲欧洲一区二区三区在线观看| 日本精品视频在线播放| 日韩中文字幕精品| 欧美在线不卡区| 成人福利在线观看| 欧美噜噜久久久xxx| 久久久免费精品视频| 中文字幕精品久久久久| 国产精品第一视频| 欧美日韩免费在线| 日本在线观看天堂男亚洲| 91免费精品视频| 日韩高清欧美高清| 久久av中文字幕| y97精品国产97久久久久久| 精品国产一区二区三区四区在线观看| 欧美激情三级免费| 欧美裸身视频免费观看| 久久香蕉精品香蕉| 国产一区二区三区在线| 91亚洲一区精品| 国产在线拍偷自揄拍精品| 中文字幕日本精品| 欧美成人性色生活仑片| 日韩欧美成人区| www.亚洲免费视频| 久久精品91久久香蕉加勒比| 97色在线观看免费视频| 日韩黄色高清视频| 伊人伊成久久人综合网站| 国产成人福利视频| 日韩av在线网站| 国产亚洲视频中文字幕视频| 丝袜亚洲另类欧美重口| 精品国内亚洲在观看18黄| 超碰日本道色综合久久综合| 日韩国产精品一区| 7777kkkk成人观看| 在线观看日韩视频| 国产精品扒开腿做| 国产91精品最新在线播放| 国产精品吊钟奶在线| 午夜精品久久久99热福利| 久久久久久久久久久久av| 91热精品视频| 精品亚洲一区二区三区在线播放| 日本一区二区在线播放| 亚洲人成电影在线| 97视频在线播放| 日本国产精品视频| 日韩精品在线视频美女| 日韩中文在线中文网在线观看| 5566成人精品视频免费| 在线观看国产精品日韩av| 欧美成人黑人xx视频免费观看| 日本亚洲欧洲色α| 欧美性videos高清精品| 亚洲日本成人网| 久久青草福利网站| 国产日韩av在线| 久久综合亚洲社区| 亚洲免费电影在线观看| 久久久国产成人精品| 日韩av最新在线| 色噜噜狠狠狠综合曰曰曰| 日韩av一区二区在线| 日韩电影中文字幕| 欧美裸体视频网站| 日韩精品免费视频| 91精品国产91久久久久久| 中文.日本.精品| 欧美激情在线播放| 欧美视频在线观看免费网址| 欧美午夜精品久久久久久人妖| 亚洲精品国产综合区久久久久久久| 日韩成人激情在线| 欧美日韩午夜剧场| 国产精品免费久久久久影院| 九九热最新视频//这里只有精品| 日韩在线中文视频| 日本三级韩国三级久久| 日韩成人小视频|