Android自从2008年出生到如今已经十多个年头了,伴随着Android系统的出生,带动了一代Android开发人员的成长。为了解决一系列的开发问题和兼容问题,不断的有优秀的框架产生,让我们的开发过程变得越来越简单,图片加载框架:,所需要关注的具体技术实现部分变得越来越少,而可以更加专心的关注于具体的业务实现部分。这里,我要谈的是在这不断发展的过程。如下,列出比较主流的Android框架。
网络请求框架
网络请求框架是为了解决开发过程中与后台交互请求而诞生的,一般是实现 http 、 https
协议请求。好的网络请求框架能让我们的网络请求更快,容错处理更优。让我们不必要花费过多的精力具体的网络请求实现上,常用的网络请求框架有如下:
- HttpClient
HttpClient是Apache开源组织提供的HTTP网络访问接口,一个简单的HTTP客户端,可以发送HTTP请求,接受HTTP响应。但是不会缓存服务器的响应,不能执行HTTP页面中签入嵌入的JS代码,自然也不会对页面内容进行任何解析、处理,这些都是需要开发人员来完成的。被内置于早期的Android代码中。 - Volley
Volley是2013年由Google推出。它既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-
Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕 - OkHttp
HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它有以下默认特性:1.支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接;2.
连接池减少请求延时;3.透明的GZIP压缩减少响应数据的大小4.缓存响应内容,避免一些完全重复的请求 - Retrofit
Retrofit简单的说就是一个网络请求的适配器,它将一个基本的Java接口通过动态代理的方式翻译成一个HTTP请求,并通过OkHttp去发送请求。此外它还具有强大的可扩展性,支持各种格式转换以及RxJava。
图片加载框架
- IMageLoader
ImageLoader的工作原理是这样的:在显示图片的时候,它会先在内存中查找;如果没有,就去本地查找;如果还没有,就开一个新的线程去下载这张图片,下载成功会把图片同时缓存到内存和本地。 基于这个原理,我们可以在每一次退出一个页面的时候,把ImageLoader内存中的缓存全都清除,这样就节省了大量内存,反正下次再用到的时候从本地再取出来就是了。 此外,由于ImageLoader对图片是软引用的形式,所以内存中的图片会在内存不足的时候被系统回收(内存足够的时候不会对其进行垃圾回收)。 - Glide
Glide采取的多级缓存机制,能够较为友好地实现图片、动图的加载。其主要有 内存缓存+磁盘缓存 ,当然他们的作用也有不同,其中内存缓存主要用于防止将重复的图读入内存中,磁盘缓存则用于防止从网络或者其他地方将重复下载和数据读取。 - Picasso
Picasso是一款强大的图片下载和缓存开源软件,只能在Android平台上使用,由Square开发。使用Picasso可以添加一些必须的特性和视觉效果到Android应用中的图片。Picasso只有一些图片加载框架应有的基本功能,所以因此它是最轻量的,在需求只要基本的图片加载与双缓存功能下,可以选Picasso作为项目的基础库,Picasso它内部默认是使用OkHttpClient作为加载网络图片的下载器,毕竟不用自家用谁的,在OkHttpClient没有的情况下则使用HttpUrlConnection,同上面一样,下载器+线程池+Handler,不过它内部的线程池比较有意思,线程池的线程数量是根据当前的网络环境来动态改变的,wifi网络下为4,4G为3,3G为2,2G为1,其它情况下默认为3,支持渐显效果。 - fresco
Facebook的Fresco图片框架性能优化最为出名,代码量也最大,拆出来的jar包也多。它内部用了大量的建造者模式、单例模式、静态工厂模式、生产/消费者模式。内部实现比较复杂,就拿图片加载来说,是通过在异步线程中回调图片的输入流,然后通过一系列读取、写入、转化成EncodedImage,然后再Decode成Bitmap,通过Handler转给UI线程显示,通过IO操作存储在硬盘缓存目录下。
事件总线框架
- EventBus
EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。 - Otto
OTTO是Square推出的库,otto基于Guava项目的Android支持库,如果你在Android程序开发的过程中想要不同的组件之间进行有效的通信可以使用这个库。通过otto库可以降低程序之间的耦合性。 - AndroidEventBus
AndroidEventBus是一个Android平台轻量级的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使得我们的代码更加简洁,耦合性更低,提升我们的代码质量。 - RxBus
Rxbus属于Rxjava库下一小部分功能,如果项目已经使用Rxjava,就不需要再额外引入EventBus库来使用了,直接使用Rxbus就可以了
依赖注入框架
- Dragger 2
Dagger已经加入Google I/O, 是Square开发的依赖注入库, 发布2.0版本. Dagger表示有向非循环图(Directed Acyclic Graph, DAGger)。Dagger 2完全依靠使用Java注释处理器和编译时检查来分析和验证依赖性。它被认为是迄今为止构建的最有效的依赖项注入框架之一。 - ButterKnife
ButterKnife可以让我们从大量的findViewById()和setonclicktListener()解放出来,其对性能的影响微乎其微(查看过Butter Knife的源码,其自定义注解的实现都是限定为RetentionPolicy.CLASS,也就是到编译出.class文件为止有效,在运行时不额外消耗性能,其是通过java注解自动生成java代码的形式来完成工作),其也有一个明显的缺点,那就是代码的可读性差一些
数据解析框架
- Gson
Gson (又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。而JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,广泛应用于各种数据的交互中,尤其是服务器与客户端的交互。 - Jackson
Java Json Jackson是Java语言编写的Json 库。它拥有强大的数据绑定能力并且提供了一个框架以实现序列化自定义的Java Object为JSON和反序列化JSON为Java对象。使用Jackson编写的JSON可以包含内嵌的类信息以便在反序列化的时候可以创建复杂的对象树。 - FastJson
Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。 它还可以用于将JSON字符串转换为等效的Java对象。 Fastjson可以与任意Java对象一起使用,包括您没有源代码的现有对象。 - LoganSquare
适用于Android的最快的JSON解析和序列化库。 LoganSquare基于Jackson的流API,能够始终比GSON和Jackson的Databind库性能高出400%或更高1。 通过依靠编译时注释处理来生成代码,您知道JSON的解析和序列化速度比任何其他可用方法都快。
响应式编程框架
- RxJava
RxJava是Reactive Extensions的Java VM实现:该库用于通过使用可观察的序列来组成异步和基于事件的程序。它扩展了观察者模式以支持数据/事件序列,并添加了运算符,使您可以声明性地将序列组合在一起,同时消除了对诸如低级线程,同步,线程安全和并发数据结构之类的问题的担忧。 - RxAndroid
该模块向RxJava添加了最小的类,这些类使在Android应用程序中编写反应式组件变得简单而轻松。 更具体地说,它提供了一个在主线程或任何给定的Looper上进行调度的Scheduler。 - DataBinding
Google开源的数据绑定框架, 实现了MVVM架构, 增强了xml的功能, 大幅度精简了java代码量, 并且代码可读性更高, 对性能的影响基本为零。DataBinding会自动在build目录下生成类. 因为被集成进AndroidStudio所以不需要你手动编译会实时编译, 并且支持大部分代码补全. - Agera
Agera(在瑞典语中表示“行动”)是超轻量Android库,可以为生命周期内不同形式的Android应用组件(如:活动组件Activities)或对象(如:视图对象Views)提供待用数据。该Android库引入函数响应编程机制,有利于数据处理过程中清晰划分时间、地点、要素等内容,因此只需使用拟自然语言简单说明便能描述复杂的异步处理过程。
开发框架
- MVC
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。 - MVP
MVP的全称为Model-View-Presenter,Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。 - MVVM
MVVM是Model-View-ViewModel的简写。它本质上就是MVC (Model-View- Controller)的改进版。即模型-视图-视图模型。【模型】指的是后端传递的数据。【视图】指的是所看到的页面。【视图模型】mvvm模式的核心,它是连接view和model的桥梁。它有两个方向:一是将【模型】转化成【视图】,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。二是将【视图】转化成【模型】,即将所看到的页面转化成后端的数据。实现的方式是:DOM 事件监听。这两个方向都实现的,我们称之为数据的双向绑定。