色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

Android Fresco圖片加載優化的方案

瀏覽:7日期:2022-09-20 15:06:22
優化背景

一般情況下,Fresco圖片加載需使用SimpleDraweeView,這個控件并不能自動根據自身的尺寸按需加載圖片,即一個 N×N 的UI控件,背后加載的實際圖片可能是 2N×2N。這就導致了實際應用運行過程中的內存使用效率不高,需要針對其進行內存優化。

Android Fresco圖片加載優化的方案

在一些入門級硬件設備上,表現得尤為明顯,隨著程序的運行時間的增長,OOM的風險也不斷加大。

Fresco版本:1.13.0

數據記錄

聲明控件大小為 480×270

<com.facebook.drawee.view.SimpleDraweeView android: android:layout_width='480dp' android:layout_height='270dp' android:layout_alignParentBottom='true' android:layout_centerHorizontal='true' app:layout_constraintBottom_toBottomOf='parent' app:layout_constraintLeft_toLeftOf='parent' app:layout_constraintRight_toRightOf='parent' app:layout_constraintTop_toTopOf='parent' />

加載圖片代碼,調用Fresco的setImageURI

val mImageUrl = 'https://static.runoob.com/images/demo/demo4.jpg'val simple_drawee_view = findViewById<SimpleDraweeView>(R.id.simple_drawee_view)simple_drawee_view.setImageURI(mImageUrl)

運行后dump內存如下,可以發現內存中的圖片尺寸為1920×1080,即此時SimpleDraweeView會按照網絡上的原圖尺寸進行加載,內存占用大小為 8294475Bytes = 7.91Mb。一張圖片占用近8Mb,在圖片顯示十分豐富的頁面場景中,圖片總內存占用大小將特別美麗,萬一這個頁面又內存泄漏了,那就更美麗了。

Android Fresco圖片加載優化的方案

如果只加載 480×270 大小的圖片,內存占用為 518475Bytes = 0.49Mb。相較于原來 1920×1080 尺寸,內存減小了 94%!

Android Fresco圖片加載優化的方案

優化方案

Fresco提供了resize api,使得調用者在圖片解碼前可以修改內存中圖片的大小,api大致如下

ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .setResizeOptions(new ResizeOptions(width, height)) .build();PipelineDraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(mDraweeView.getController()) .setImageRequest(request) .build();mSimpleDraweeView.setController(controller);

注意這個方案在低版本中默認只支持jpg圖片,如需支持其它圖片格式,需在設置image pipeline時添加isDownSample配置。同時對于產生的圖片的尺寸,只能粗略地控制,圖片不能修改為確定的尺寸。

.setDownsampleEnabled(true)

這個方案有個顯著的缺點,那就是頁面適配性極差,需要配合View層的生命周期在確保能夠動態獲取到控件寬高的時機進行調用,對于一個成熟的項目工程,代碼改動量過大,優化成本過高。 這里采用編寫SimpleDraweeView的子類進行優化,利用向上轉型,盡可能的減小View層代碼的改動,只需要修改xml布局文件中的控件聲明即可。 方案架構圖如下:

Android Fresco圖片加載優化的方案

其中DesiredSimpleDraweeView為SimpleDraweeView的子類,在onWindowFocusChanged方法回調中可以明確獲知控件的具體寬高,之后再進行圖片加載操作。

public class DesiredSimpleDraweeView extends SimpleDraweeView { Uri mUri; Object mCallerContext; public DesiredSimpleDraweeView(Context context) { super(context); } @Override public void setImageURI(Uri uri, Object callerContext) { mUri = uri; mCallerContext = callerContext; } private void setImageURI(int width, int height) { try { ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(mUri) .setResizeOptions(new ResizeOptions(width, height)) .build(); DraweeController controller = getControllerBuilder() .setOldController(getController()) .setImageRequest(imageRequest) .build(); setController(controller); } catch (Exception ex) { ex.printStackTrace(); } } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if (hasWindowFocus) { setImageURI(getWidth(), getHeight()); } }}

復寫setImageURI(Uri,Object)方法,暫存uri和callerContext,在onWindowFoucusChanged回調之后再根據控件寬高進行圖片的加載。 這樣,利用向上轉型,View層的代碼無需改動,xml文件中替換控件聲明后即可顯著提高內存利用率。

注意事項

性能優化是條永無止境的道路,沒有最牛逼的方案,只有最合適的方案。如果對于圖片加載尺寸想要精確控制,按需加載,Glide或許是更好的選擇。

以上就是Android Fresco圖片加載優化的方案的詳細內容,更多關于Android Fresco圖片加載優化的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 中文字幕无线精品乱码一区 | 国内精品1区1区3区4区 | 99视频国产精品 | 久草国产在线 | 成人羞羞视频国产 | 中文字幕在亚洲第一在线 | 久久国产精品99久久久久久牛牛 | 一级国产a级a毛片无卡 | 99视频在线观看免费视频 | 男人把女人桶到喷白浆的视频 | www亚洲免费 | 欧美日韩一日韩一线不卡 | 91精品国产91久久久久久青草 | 久久黄色精品视频 | 久久综合久久美利坚合众国 | 波多野结衣在线观看3人 | 美女张开大腿让男人桶 | 欧美日韩国产成人精品 | 一级黑人 | 免费一级毛片正在播放 | 欧美一级毛片欧美毛片视频 | 久久巨乳 | 免费午夜扒丝袜www在线看 | 国产爽的冒白浆的视频高清 | 亚洲天堂视频在线 | 精品无人区一区二区三区a 精品午夜国产在线观看不卡 | 日本一级高清片免费 | 午夜主播福利视频在线观看 | 香蕉视频黄色在线观看 | 东京一区二区三区高清视频 | 国产精品久久久久久久久久一区 | 国产成人教育视频在线观看 | 老太婆性杂交毛片 | 国产码一区二区三区 | 成人欧美视频免费看黄黄 | 亚洲视频免费 | 亚洲精品欧美精品一区二区 | 精品伊人久久久久网站 | 欧美人交性视频在线香蕉 | 青青自拍视频一区二区三区 | 美国一级免费毛片 |