日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Glide 这样用,更省内存!!!

發(fā)布時間:2024/8/26 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Glide 这样用,更省内存!!! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、前言

Glide 是 Google 官方推薦的一款圖片加載庫,使用起來也非常的簡單便利,Glide 它幫我們完成了很多很重要,但是卻通用的功能,例如:圖片的加載壓縮、展示、加載圖片的內(nèi)存管理等等。

對 Glide 還不熟悉的朋友,可以參考 《一篇好文,助你上手 Glide》

但是,在使用 Glide 的時候,有一些小技巧,可以讓你的內(nèi)存更優(yōu)化,避免可能出現(xiàn)的 OOM。例如:雖然 Glide 會根據(jù)加載的控件大小,優(yōu)化加載后的圖片尺寸,可如果加載的是一張全屏的大圖,依然會是一個占用內(nèi)存空間非常大的操作。

具體一張 Bitmap 到底占用了多少內(nèi)存空間,可以參考《Bitmap 比你想的更費(fèi)內(nèi)存 | 吊打 OOM》

本文有些建議來自 Android TV App,而 Android TV 眾多的智能電視和智能盒子,實際上硬件條件非常的惡劣,而 Android TV 的 App ,為了美化,會用到大部分的圖片,所以在圖片使用方面,OOM 的問題就會被放大,而下面介紹的一些優(yōu)化方案,在 Android 手機(jī)硬件條件非常好的環(huán)境下,不使用影響也不大。

二、開始優(yōu)化

2.1 配置好 TrimMemory 和 LowMemory

Glide 幫我們做了大部分內(nèi)存管理方面的事情,實際上它還支持做的更好。

對于一個 App 而言,在系統(tǒng)內(nèi)存環(huán)境不足的情況下,會回調(diào)一些 onTrimMemory() 或者 onLowMemory() 等方法,這些都是在提醒開發(fā)者,當(dāng)前設(shè)備的內(nèi)存環(huán)境已經(jīng)發(fā)生了變化,你最好調(diào)整你的內(nèi)存使用策略,避免被系統(tǒng)清理掉或者出現(xiàn) OOM 。

關(guān)于 onTrimMemroy() 相關(guān)內(nèi)容,不了解的可以先參考《Android 開發(fā),跳不過的內(nèi)存管理》

而 Glide 也為我們提供了類似方法的接口,開發(fā)者只需要調(diào)用即可,它在內(nèi)部會隨著不同的內(nèi)存情況,幫我們對緩存的圖片進(jìn)行優(yōu)化。

在這里,你主要用到 Glide 的 trimMemory() 和 cleanMemroy() 方法,它們一個用來裁剪 Glide 緩存的圖片內(nèi)存空間,一個用來清理 Glide 緩存的內(nèi)存空間。

在使用 onTrimMemory() 之前,一般是實現(xiàn) ComponentCallbacks2 接口,然后在 Application 中,通過 registerComponentCallbacks() 方法進(jìn)行注冊。當(dāng)然,如果你嫌麻煩,還可以直接在 Application 中,重寫對應(yīng)的方法。

了解了這些,就可以根據(jù)我們的需要來配置在何時調(diào)用 Glide 的對應(yīng)方法,我推薦的配置:

  • 在 lowMemory 的時候,調(diào)用 Glide.cleanMemroy() 清理掉所有的內(nèi)存緩存。
  • 在 App 被置換到后臺的時候,調(diào)用 Glide.cleanMemroy() 清理掉所有的內(nèi)存緩存。
  • 在其它情況的 onTrimMemroy() 回調(diào)中,直接調(diào)用 Glide.trimMemory() 方法來交給 Glide 處理內(nèi)存情況。
  • 那么對應(yīng)的代碼,如下:

    既然知道需要調(diào)用 Glide 的這兩個方法,我們還是需要了解到它內(nèi)部到底幫我們做了什么。先來看看 Glide 對應(yīng)的源碼。

    在 Glide 的這些方法內(nèi),可以看到,它們都會去操作 memoryCachebitmapPool 這兩個對象,實際上它們是兩個接口,這里如果做特殊處理,操作的都是 Glide 對它們的默認(rèn)實現(xiàn),LruResourceCacheLruBitmapPool 。從名稱上可以看出來,它們都是遵循 Lru 算法的。

    就 Glide 而言,Memory Cache 是 Glide 用來在內(nèi)存中緩存圖片資源,使其在需要使用的時候立刻就可以使用,而不必執(zhí)行磁盤的 I/O 操作,而 BitmatPool 則是 Glide 維護(hù)了一個圖片復(fù)用池,LruBitmapPool 使用 Lru 算法保留最近使用的尺寸的 Bitmap,這不是本文的重點,大家了解一下即可。

    其實 LruResourceCache 和 LruBitmapPool 中,對 clearMemory() 和 trimMemory() 的操作是類似的,這里就以 LruBitmapPool 舉例。

    在 LruBitmapPool 中,會根據(jù)回調(diào)的方法以及參數(shù),調(diào)用 clearMemory() 或者 trimToSize(),其實最終都是調(diào)用的 trimToSize() 方法。它用于裁剪當(dāng)前緩存資源的個數(shù)。

    可以看到,根據(jù)裁剪的目標(biāo)尺寸,會去回收多余的 Bitmap 到合適的目標(biāo)大小,以達(dá)到清理內(nèi)存的目的。

    2.2 配置 GlideModule

    GlideModule 是 Glide 提供的一個配置接口,它會在第一次使用 Glide 的時候被調(diào)用,用于進(jìn)行 Glide 的一些初始的配置。

    具體 GlideModule 的使用,可以參見官方文檔:

    https://github.com/bumptech/glide/wiki/Configuration

    GlideModule 是一個接口,需要實現(xiàn)其對應(yīng)的方法。

    這里我們只需要使用 applyOptions() 這個方法,它用于在 Glide 的默認(rèn)配置的基礎(chǔ)上,追加一些我們需要的配置。

    而在這里,我們可以根據(jù)當(dāng)前設(shè)備的內(nèi)存情況,對其進(jìn)行一個設(shè)定,使用 ActivityManager 獲取當(dāng)前設(shè)備的內(nèi)存情況,如果是處于 lowMemory 的時候,將圖片的 DecodeFormat 設(shè)置為 RGB_565RGB_565 和默認(rèn)的 ARGB_8888 比,每個像素會少 2 個byte,這樣,等于一張同樣的圖片,加載到內(nèi)存中會少一半內(nèi)存的占用(ARGB_8888 每個像素占 4 byte)。

    2.3 避免使用圓角的ImageView

    在實際項目內(nèi),經(jīng)常會用到一些帶圓角的圖片,或者直接就是圓形的圖片。圓形的圖片,多數(shù)用于一些用戶的頭像之類的顯示效果。

    而在 Android 下,也有大量的類似 XxxImageView 的開源控件,用于操作 Bitmap 以達(dá)到一個圓角圖片的效果,例如 Github 上比較火的 RoundedImageView

    它們大部分的原理,是接收到你傳遞的 Bitmap ,然后再輸出一個與原來 Bitmap 等大的新 Bitmap ,在此基礎(chǔ)之上,進(jìn)行圓角的一些處理,這就導(dǎo)致了,實際上會在內(nèi)存中,多持有一個 Bitmap ,一下一張圖片占用的內(nèi)存就被加倍了。

    所以既然已經(jīng)選擇使用 Glide ,推薦使用 glide-transformations 這個開源庫配合使用,glide-transformations 利用 Glide 的 bitmapTransfrom() 接口,實現(xiàn)對加載的 Bitmap 的進(jìn)行一些變換操作。

    glide-transformations 的 Github 地址如下:

    https://github.com/wasabeef/glide-transformations

    glide-transformations 提供一系類對加載的圖片的變換操作,從形狀變換到色彩變換,全部支持,基本上滿足大部分開發(fā)需要,并且它會復(fù)用 Glide 的 BitmapPool ,來達(dá)到節(jié)約內(nèi)存的目的。

    具體 glide-transformations 的使用,可以查看 Github 上的文檔,下面是它的一個效果圖。

    2.4 根據(jù)內(nèi)存情況,裁剪你的圖片

    前面的介紹的一些優(yōu)化點,都是一些推薦的通用做法,基本上用了前面介紹的辦法,圖片導(dǎo)致的 OOM 應(yīng)該會大幅度減少。

    接下來介紹一個在 Android TV 上,加載全屏大圖的時候,優(yōu)化內(nèi)存問題的一個解決辦法。

    首先要明確一點,國內(nèi) Android TV 的硬件環(huán)境非常的不好,二百三百的智能盒子到處都在賣,畢竟也是跑的 Android 系統(tǒng),你想想你使用的是一款 299 的 Android 手機(jī),你對它也不會有什么期待了。但是 Android TV 又是為了電視做的,所以大部分情況下,它都是需要支持 1920 * 1280 之類的屏幕尺寸,導(dǎo)致它如果加載一張全屏的大圖,消耗的內(nèi)存是不忍直視的,如果在內(nèi)存環(huán)境不好的情況下,可能就直接 OOM 崩潰了。

    所以,對于這種極端的情況,我想到了一個辦法,根據(jù)當(dāng)前的內(nèi)存環(huán)境,按比例縮小需要顯示的全屏圖片,這樣加載到內(nèi)存中的圖片,就是按比例縮小的。

    在這里就需要用到 DrawableRequestBuilder 的 override() 這個 Api 了,它可以接受一個 width 和 height ,來重新指定加載圖片的尺寸。

    既然 Glide 已經(jīng)提供了標(biāo)準(zhǔn)的 Api ,那么我們還需要獲取到當(dāng)前運(yùn)行設(shè)備的寬高。

    這里推薦使用 getRealSize() 的方式獲取屏幕的寬高,它可以真實的拿到當(dāng)前屏幕的尺寸。其它 Api 在部分智能電視和盒子上,拿到的尺寸會小,因為沒有計算 StatusBar 或者 NavigationBar的高度,這些都是經(jīng)驗之談。

    同時,我們也需要用到 ComponentCallbacks2 這個接口,前面已經(jīng)介紹過了,就不再贅述了。

    在其中,記錄 trim 的 level 這個值,反應(yīng)當(dāng)前的內(nèi)存級別,在使用的時候,通過 getBitmapSize() 裁剪出一個符合當(dāng)前內(nèi)存環(huán)境的尺寸。

    例子中只是對 TRIM_MENORY_RUNNING_LOW 進(jìn)行了處理,會根據(jù)屏幕尺寸,縮放到 0.8f 倍的狀態(tài)。如果要做的更多,可以將其它幾個 level 也加上,調(diào)整不同的縮放倍數(shù)。

    兩個都輸出一下,看看差別,同一張全屏的圖片,不縮放和縮放 0.8f 的差別。

    I/cxmyDev: bgImage byteCount : 8294400 I/cxmyDev: bgImage byteCount : 5308416

    可以看到,優(yōu)化的目的還是達(dá)到了。可以節(jié)約大概 3MB 左右的內(nèi)存空間,而圖片又不至于模糊到無法看的地步。

    三、小結(jié)

    優(yōu)化是沒有終點的,今天先聊到這里,之后有想到的再補(bǔ)充。如果你有什么更好的建議,可以在文末留言一起討論一下。

    點贊或者分享吧~

    轉(zhuǎn)載于:https://www.cnblogs.com/plokmju/p/7614339.html

    總結(jié)

    以上是生活随笔為你收集整理的Glide 这样用,更省内存!!!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲天堂中文字幕在线观看 | 91精品国产91久久久久久黑人 | 久久精品一日日躁夜夜躁 | 国产麻豆精品久久一二三 | 91亚洲精品一区二区乱码 | 九一精品视频 | 一本大道久久久久精品嫩草 | 成人激情电影在线观看 | 日韩三级a | 91久久一区| 色悠悠国产 | 久久久婷 | 91丝袜国产在线观看 | 国产女同在线观看 | 性折磨bdsm欧美激情另类 | 人人妻人人澡人人爽 | 日本久久免费 | 成人精品免费 | 国产色av| 亚洲成人一区在线观看 | 加勒比综合| 国产精品手机在线 | 亚洲午夜在线观看 | 黄色大片aaa | 999精品免费视频 | 日韩欧美成人一区二区 | 93久久精品日日躁夜夜躁欧美 | 天天综合视频 | 麻豆污视频 | 69xx国产| 国产女主播在线播放 | 少妇又紧又色又爽又刺激视频 | 不卡中文字幕在线 | 五月天一区二区 | 日本va视频| 魔女鞋交玉足榨精调教 | 日本高清免费不卡视频 | 国产成人在线观看网站 | 中文字幕第一页在线视频 | 超碰免费看 | 中文字幕乱码人妻二区三区 | 国产农村妇女精品久久久 | 国内自拍真实伦在线观看 | 奇米四色影视 | 精品免费看 | 最新黄色av网站 | 久久阁| 毛片基地免费观看 | 少妇紧身牛仔裤裤啪啪 | 成 年 人 黄 色 大 片大 全 | 72成人网| 日韩美女毛片 | 亚洲乱码视频在线观看 | 男女激情网 | 欧美日韩小说 | 少妇特黄a一区二区三区88av | 91免费观看网站 | 超碰在线公开免费 | 亚洲第一网站 | free性护士vidos猛交 | 国产福利91精品 | av毛片在线播放 | 最新欧美日韩 | 污网站在线免费看 | 亚洲色图网友自拍 | 亚洲一区久久久 | 人人干免费 | 一区二区福利 | 爱爱视频欧美 | 日韩69| 牛av| 成人黄色一级片 | 日韩美女视频一区二区 | 国产精品永久 | 爆操白虎逼 | 国产高清中文字幕 | 免费视频网站www | 成人小网站 | 天堂av官网 | 久久嫩草精品久久久久 | 国产综合av | 成人在线观看18 | 国产福利资源 | 麻豆国产在线视频 | 欧美人与性动交α欧美片 | 日本伦理一区二区 | 日韩成人激情视频 | 亚洲av最新在线网址 | 国产精品麻豆一区二区三区 | 极品探花在线播放 | 丝袜视频在线观看 | 精品国产免费观看 | 日本色影院 | 91超碰人人 | 在线一区观看 | 国产叼嘿视频 | 韩国美女视频在线观看18 | 思思久久精品 | 国产精品永久在线观看 |