Android項目重構實踐:從 Fresco 到 Glide 低成本重構方案

作者:ImWiki

Fresco 是一個***性很重的框架,如果使用 Fresco 我們的ImageView都要替換爲 SimpleDraweeView,如果使用自定義ImageView,就非常麻煩。雖然 SimpleDraweeView 提供了非常豐富的功能,比如圓角,邊框等,但有時候會出現非常奇怪的佈局異常。在5.0版本以前 Fresco 可以有效降低 OOM,但是現在已經沒有優勢了,所以項目計劃從 Fresco 替換爲 Glide。

Fresco 缺點

  • 包太大。
  • 容易出現未知佈局錯誤。
  • ***性太強,必須使用Fresco的View控件。

替換分析

由於項目中大量使用了SimpleDraweeView來實現佈局,而且SimpleDraweeView提供了豐富的圓角、圓形、邊框等。修改整個項目的佈局代碼也不現實,所以我們需要創一個包名、屬性名稱和SimpleDraweeView都一樣的View,提供相同的功能,這樣就可以大大降低替換成本。但是這個SimpleDraweeView不是全功能的,因爲完全模仿成本太高,所以我們需要去掉 setImageRequest(ImageRequest request)和 getControllerBuilder() 這些調用方法,只提供通用的調用方法和屬性。

自定義替換控件

我已經封裝好了替換方案 ImageViewEx,可以直接引入工程。

api 'com.taoweiji:SimpleDraweeView:0.9.5'

自定義 RoundedCornerDrawable

我們實際上可以直接在ImageView.onDraw的方法中繪製圖片,但是通過自定義 Drawable 可以讓組件可控性更好,也可以複用。由於繪製比較複雜,這裏就不一一介紹,請直接瀏覽我的Github代碼。

自定義 ImageViewExBase

創建一個抽象的基礎ImageView類,用於承載圓角、邊框等功能。

自定義 ImageViewEx

繼承ImageViewExBase,這個是用來替換SimpleDraweeView的,後續我們新寫的代碼還是儘量不要使用SimpleDraweeView,使用ImageViewEx代替。

自定義 SimpleDraweeView

這個類是關鍵,也是繼承ImageViewExBase,功能和ImageViewEx是一樣的,只是XML的屬性是延續Fresco的,包名必須是 com.facebook.drawee.view,並且xml的屬性也必須和Fresco是一致的。需要重寫 setImageURI(Uri uri),使用回調方式讓開發者實現圖片顯示。

Android項目重構實踐:從 Fresco 到 Glide 低成本重構方案

設置 LoadHandler

class MyApplication : Application() {
 override fun onCreate() {
 super.onCreate()
 SimpleDraweeView.setLoadHandler { imageView, url ->
 // TODO 實現圖片顯示
 }
 }
}

說明

提供的 com.facebook.drawee.view.SimpleDraweeView 的屬性是支持全部的 Fresco 屬性,但是功能不是全部支持,替換之後需要深度的測試,避免有錯誤。

開源項目地址

https://github.com/taoweiji/ImageViewEx

Android學習PDF+架構視頻+面試文檔+源碼筆記


感謝大家能耐着性子看完

在這裏小編也分享一份自己收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習

如果你有需要的話,可以點贊+評論關注我,然後加我VX:15388039515 我發給你
(或關注微信公衆號“Android開發之家”回覆【資料】免費領取)
Android項目重構實踐:從 Fresco 到 Glide 低成本重構方案

Android項目重構實踐:從 Fresco 到 Glide 低成本重構方案

Android項目重構實踐:從 Fresco 到 Glide 低成本重構方案

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章