30

Android项目重构实践:从 Fresco 到 Glide 低成本重构方案

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ%3D%3D&%3Bmid=2247489321&%3Bidx=1&%3Bsn=ef033920b1e3ab0e1701f04f86b61825
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

code小生,一个专注大前端领域的技术平台

公众号回复 Android 加入我的技术群

作者: ImWiki

链接: https://www.jianshu.com/p/c8ec2ac8a465

声明: 本文已获 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),使用回调方式让开发者实现图片显示。

RzQBb2F.jpg!web

设置 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK