使用Picasso加載圖片的內存優化實踐
0 說明
現在Android開源庫中有許多圖片加載框架,本文以picasso為例,總結下開發過程中的一些優化經驗,使用的picasso版本如下
compile 'com.squareup.picasso:picasso:2.5.2'
1 圖片裁剪
在列表頁盡量使用裁剪后的圖片,在查看大圖模式下才加載完整的圖片。
圖片裁剪示例
Picasso.with( imageView.getContext() ) .load(url) .resize(dp2px(250),dp2px(250)) .centerCrop() .into(imageView);
picasso默認情況下會使用全局的ApplicationContext,即開發者傳進去Activity,picasso也會通過activity獲取ApplicationContext。
2 查看大圖放棄memory cache
Picasso默認會使用設備的15%的內存作為內存圖片緩存,且現有的api無法清空內存緩存。我們可以在查看大圖時放棄使用內存緩存,圖片從網絡下載完成后會緩存到磁盤中,加載會從磁盤中加載,這樣可以加速內存的回收。
Picasso.with(getApplication()) .load(mURL) .memoryPolicy(NO_CACHE, NO_STORE) .into(imageView);
其中memoryPolicy的NO_CACHE是指圖片加載時放棄在內存緩存中查找,NO_STORE是指圖片加載完不緩存在內存中。
3 RecyclableImageView
重寫ImageView的onDetachedFromWindow方法,在它從屏幕中消失時回調,去掉drawable引用,能加快內存的回收。
public class RecyclerImageView extends ImageView { ...@Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); setImageDrawable(null); }
}</pre>
實驗環境:加載大圖不使用內存緩存。
實驗場景:從圖片列表頁切換到詳情頁看大圖,然后返回,不停重復。![]()
普通ImageView</div>![]()
RecyclableImageView</div>可以看到使用了RecyclableImageView的實驗在切換過程中產生的內存谷值明顯優于ImageView,說明drawable更容易被回收。
4 新進程中查看大圖
列表頁的內存已經非常穩定,但是查看大圖時,大圖往往占用了20+m內存,加上現有進程中的內存,非常容易oom,在新進程中打開Activity成為比較取巧的避免oom的方式。
<activity android:name=".DetailActivity" android:process=":picture"/>只要在AndroidManifest.xml中定義Activity時加入process屬性,即可在新進程中打開此Activity。由此,picasso也將在新進程中創建基于新ApplicationContext的單例。
5 列表頁滑動優化
picasso可以對多個加載請求設置相同的tag,即
Object tag = new Object();Picasso.with( imageView.getContext() ) .load(url) .resize(dp2px(250),dp2px(250)) .centerCrop() .tag(tag) .into(imageView);例如在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); } } });6 RGB_565
對于不透明的圖片可以使用RGB_565來優化內存。
Picasso.with( imageView.getContext() ) .load(url) .config(Bitmap.Config.RGB_565) .into(imageView);默認情況下,Android使用ARGB_8888
Android中有四種,分別是: ALPHA_8:每個像素占用1byte內存 ARGB_4444:每個像素占用2byte內存 ARGB_8888:每個像素占用4byte內存 RGB_565:每個像素占用2byte內存RGB_565呈現結果與ARGB_8888接近,內存對比如下圖
![]()
默認ARGB_8888,列表滑動時平均內存10m</div>![]()
RGB_565,列表滑動時,平均7M</div>7 reference
Picasso and Context
JakeWharton的避免OOM建議
Clear Cache memory of Picasso本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!相關經驗
相關資訊