亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android Fresco圖片加載怎么優化

發布時間:2021-03-17 14:04:37 來源:億速云 閱讀:185 作者:小新 欄目:開發技術

小編給大家分享一下Android Fresco圖片加載怎么優化,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

優化背景

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

Android Fresco圖片加載怎么優化

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

Fresco版本:1.13.0

數據記錄

聲明控件大小為 480×270

<com.facebook.drawee.view.SimpleDraweeView
  android:id="@+id/simple_drawee_view"
  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圖片加載怎么優化”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

建宁县| 泰和县| 泰顺县| 普宁市| 隆德县| 陇南市| 尉犁县| 三门峡市| 固始县| 涪陵区| 信丰县| 灵丘县| 陕西省| 怀宁县| 宜都市| 巧家县| 印江| 仪陇县| 西宁市| 吉木萨尔县| 郁南县| 合水县| 阿拉善左旗| 辽阳市| 南汇区| 曲阳县| 出国| 迭部县| 宝丰县| 焦作市| 高邑县| 腾冲县| 武汉市| 吉木萨尔县| 加查县| 海宁市| 麟游县| 扎兰屯市| 汕头市| 保德县| 廉江市|