国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用Picasso加載圖片的內存優化實踐

2019-11-09 15:00:34
字體:
來源:轉載
供稿:網友

轉載自http://blog.csdn.net/ashqal/article/details/48005833 ,這篇博文很難得,應該是piCSSo高級點的用法了,保存下來。

0 說明

現在Android開源庫中有許多圖片加載框架,本文以picasso為例,總結下開發過程中的一些優化經驗,使用的picasso版本如下

compile 'com.squareup.picasso:picasso:2.5.2'1

1 圖片裁剪

在列表頁盡量使用裁剪后的圖片,在查看大圖模式下才加載完整的圖片。

圖片裁剪示例

Picasso.with( imageView.getContext() ).load(url).resize(dp2px(250),dp2px(250)).centerCrop().into(imageView);12345

picasso默認情況下會使用全局的applicationContext,即開發者傳進去Activity,picasso也會通過activity獲取ApplicationContext。

2 查看大圖放棄memory cache

Picasso默認會使用設備的15%的內存作為內存圖片緩存,且現有的api無法清空內存緩存。我們可以在查看大圖時放棄使用內存緩存,圖片從網絡下載完成后會緩存到磁盤中,加載會從磁盤中加載,這樣可以加速內存的回收。

Picasso.with(getApplication()).load(mURL).memoryPolicy(NO_CACHE, NO_STORE).into(imageView);1234

其中memoryPolicy的NO_CACHE是指圖片加載時放棄在內存緩存中查找,NO_STORE是指圖片加載完不緩存在內存中。

3 RecyclableImageView

重寫ImageView的onDetachedFromWindow方法,在它從屏幕中消失時回調,去掉drawable引用,能加快內存的回收。

public class RecyclerImageView extends ImageView{ ... @Override PRotected void onDetachedFromWindow() { super.onDetachedFromWindow(); setImageDrawable(null); }}12345678910

實驗環境:加載大圖不使用內存緩存。 實驗場景:從圖片列表頁切換到詳情頁看大圖,然后返回,不停重復。

普通ImageView

RecyclableImageView

可以看到使用了RecyclableImageView的實驗在切換過程中產生的內存谷值明顯優于ImageView,說明drawable更容易被回收。

4 新進程中查看大圖

列表頁的內存已經非常穩定,但是查看大圖時,大圖往往占用了20+m內存,加上現有進程中的內存,非常容易oom,在新進程中打開Activity成為比較取巧的避免oom的方式。

<activity android:name=".DetailActivity" android:process=":picture"/>1

只要在AndroidManifest.xml中定義Activity時加入process屬性,即可在新進程中打開此Activity。由此,picasso也將在新進程中創建基于新ApplicationContext的單例。

5 列表頁滑動優化

picasso可以對多個加載請求設置相同的tag,即

Object tag = new Object();1Picasso.with( imageView.getContext() ).load(url).resize(dp2px(250),dp2px(250)).centerCrop().tag(tag).into(imageView);123456

例如在RecyclerView滑動時監聽,處理不同的表現:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { Picasso.with(context).resumeTag(tag); } else { Picasso.with(context).pauseTag(tag); } }});1234567891011121314

6 RGB_565

對于不透明的圖片可以使用RGB_565來優化內存。

Picasso.with( imageView.getContext() ).load(url).config(Bitmap.Config.RGB_565).into(imageView);1234

默認情況下,Android使用ARGB_8888

Android中有四種,分別是:ALPHA_8:每個像素占用1byte內存ARGB_4444:每個像素占用2byte內存ARGB_8888:每個像素占用4byte內存RGB_565:每個像素占用2byte內存12345

RGB_565呈現結果與ARGB_8888接近,內存對比如下圖

默認ARGB_8888,列表滑動時平均內存10m

RGB_565,列表滑動時,平均7M

7 reference

Picasso and ContextJakeWharton的避免OOM建議Clear Cache memory of Picasso


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南京市| 勃利县| 漾濞| 绍兴县| 郓城县| 无锡市| 元阳县| 汕尾市| 金湖县| 巩留县| 沂源县| 色达县| 拉萨市| 怀集县| 和田县| 花莲市| 达州市| 岑巩县| 于田县| 新安县| 黑河市| 屯昌县| 凯里市| 新郑市| 余庆县| 新乡市| 宝丰县| 岳阳市| 八宿县| 渭源县| 保德县| 泗阳县| 泰安市| 浮山县| 新和县| 仁化县| 扶余县| 剑川县| 西城区| 内江市| 鹿泉市|