鸿蒙版图片加载框架Glide(丐版)
目的
从网络上加载一张图片,这基本是每个应用都需要的功能。在android平台我们有ImageLoader,Picasso,Glide,其中又以Glide最为人熟知。为了更方便的开发鸿蒙应用,我们也根据Glide最核心的设计思路,完成鸿蒙下的图片加载框架。
Glide核心设计思路
我把这种设计模式称作为取号机设计,以大家熟悉的银行业务为例,每个进入银行需要办理业务的人,他们需求的业务各有不同,那么待办理的业务内容相当于请求信息(Request),进入银行后会被引导到取号机(RequestManager)取号,然后会被系统安排到空闲的窗口(RequestDispatcher)实际办理业务。
框架实现
定义角色
把其他肉去掉,上面的4个类就是框架的骨架,我们现在需要做的就是在骨架上填充上肌肉。
PixelMapRequest
封装图片请求信息,如图片对应的url,关联的控件,默认图的资源等。控件被用软引用持有考虑到内存问题,当内存不足时,控件引用可以被GC回收。每个请求有个标识位,其值就是url的md5值,是用来防止图片和控件错位,以及缓存key的作用。设计上模仿Glide的链式调用方式。
RequestManager
第一个这是个单例,一个应用中只需要一个实例来管理请求。管理类中包含一个请求队列,一个处理者数组,一个线程池。考虑到请求队列可能被多个线程操作,所以这里使用了LinkedBlockingQueue这种堵塞式的队列,处理者数组的长度取决于系统的能力。其他定义了一些函数,注释很明白了。
PixelMapDispatcher
二级缓存这块还没完善,后续会补上。这里就是从队列中取出请求直接通过HttpURLConnection去下载,序列化成PixelMap对象,然后显示。
ImageLoader
测试代码(配合ListContainer使用)
测试通过,ok
总结
其实只要理解了取号机这个设计,再来看这个框架非常简单,代码逻辑也不复杂,只要一些细节处理注意点就可以了。当然这个和Glide框架差距非常大,比如Glide的缓存机制,生命周期处理方法,高可配置设计都没有,但是核心的脉络已经形成了,缺少的部分后面一点点完善,毕竟那些成熟框架也不是一触而就的。
相关链接
作者:暗影萨满
厉害了,不过还是太复杂,期待更简单的第三方加载网络图片类库。