原文链接:https://blog.csdn.net/xiangzhihong8/article/details/96280254
4、 第三方库解析
4.1、Retrofit网络申请框架
概念:Retrofit是一个基于RESTful的HTTP网络申请框架的封装,其中网络申请的实质是由OKHttp实现的,而Retrofit仅仅负责网络申请接口的封装。
原理:App应用程序通过Retrofit申请网络,实际上是应用Retrofit接口层封装申请参数,Header、URL等信息,之后由OKHttp实现后续的申请,在服务器返回数据之后,OKHttp将原始的后果交给Retrofit,最初依据用户的需要对后果进行解析。
retrofit应用
1.在retrofit中通过一个接口作为http申请的api接口
`public interface NetApi {
@GET("repos/{owner}/{repo}/contributors")Call<ResponseBody> contributorsBySimpleGetCall(@Path("owner") String owner, @Path("repo") String repo);
}
`
2.创立一个Retrofit实例
`Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/") .build();
`
3.调用api接口
`NetApi repo = retrofit.create(NetApi.class);
//第三步:调用网络申请的接口获取网络申请
retrofit2.Call<ResponseBody> call = repo.contributorsBySimpleGetCall("username", "path");
call.enqueue(new Callback<ResponseBody>() { //进行异步申请
@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { //进行异步操作}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) { //执行谬误回调办法}
});
`
retrofit动静代理
retrofit执行的原理如下:
1.首先,通过method把它转换成ServiceMethod。
2.而后,通过serviceMethod,args获取到okHttpCall对象。
3.最初,再把okHttpCall进一步封装并返回Call对象。
首先,创立retrofit对象的办法如下:
`Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/") .build();
`
在创立retrofit对象的时候用到了build()办法,该办法的实现如下:
`public Retrofit build() {
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient(); //设置kHttpClient
}
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor(); //设置默认回调执行器
}
// Make a defensive copy of the adapters and add the default Call adapter.
List<CallAdapter.Factory> adapterFactories = new ArrayList<>(this.adapterFactories);
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
// Make a defensive copy of the converters.
List<Converter.Factory> converterFactories = new ArrayList<>(this.converterFactories);
return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
callbackExecutor, validateEagerly); //返回新建的Retrofit对象
}
`
该办法返回了一个Retrofit对象,通过retrofit对象创立网络申请的接口的形式如下:
`NetApi repo = retrofit.create(NetApi.class);
`
retrofit对象的create()办法的实现如下:
`public <T> T create(final Class<T> service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
new InvocationHandler() { private final Platform platform = Platform.get(); @Override public Object invoke(Object proxy, Method method, Object... args) throws Throwable { // If the method is a method from Object then defer to normal invocation. if (method.getDeclaringClass() == Object.class) { return method.invoke(this, args); //间接调用该办法 } if (platform.isDefaultMethod(method)) { return platform.invokeDefaultMethod(method, service, proxy, args); //通过平台对象调用该办法 } ServiceMethod serviceMethod = loadServiceMethod(method); //获取ServiceMethod对象 OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args); //传入参数生成okHttpCall对象 return serviceMethod.callAdapter.adapt(okHttpCall); //执行okHttpCall } });
}
`
4.2、图片加载库比照
Picasso:120K
Glide:475K
Fresco:3.4M
Android-Universal-Image-Loader:162K
图片函数库的抉择须要依据APP的具体情况而定,对于重大依赖图片缓存的APP,例如壁纸类,图片社交类APP来说,能够抉择最业余的Fresco。对于个别的APP,抉择Fresco会显得比拟重,毕竟Fresco3.4M的体量摆在这。依据APP对图片的显示和缓存的需要从低到高,咱们能够对以上函数库做一个排序。
Picasso < Android-Universal-Image-Loader < Glide < Fresco
2.介绍:
Picasso :和Square的网络库一起能施展最大作用,因为Picasso能够抉择将网络申请的缓存局部交给了okhttp实现。
Glide:模拟了Picasso的API,而且在他的根底上加了很多的扩大(比方gif等反对),Glide默认的Bitmap格局是RGB_565,比 Picasso默认的ARGB_8888格局的内存开销要小一半;Picasso缓存的是全尺寸的(只缓存一种),而Glide缓存的是跟ImageView尺寸雷同的(即5656和128128是两个缓存) 。
FB的图片加载框架Fresco:最大的劣势在于5.0以下(最低2.3)的bitmap加载。在5.0以下零碎,Fresco将图片放到一个特地的内存区域(Ashmem区)。当然,在图片不显示的时候,占用的内存会主动被开释。这会使得APP更加晦涩,缩小因图片内存占用而引发的OOM。为什么说是5.0以下,因为在5.0当前零碎默认就是存储在Ashmem区了。
3.总结:
Picasso所能实现的性能,Glide都能做,无非是所需的设置不同。然而Picasso体积比起Glide小太多如果我的项目中网络申请自身用的就是okhttp或者retrofit(实质还是okhttp),那么倡议用Picasso,体积会小很多(Square全家桶的干活)。Glide的益处是大型的图片流,比方gif、Video,如果你们是做美拍、爱拍这种视频类利用,倡议应用。
Fresco在5.0以下的内存优化十分好,代价就是体积也十分的大,按体积算Fresco>Glide>Picasso
不过在应用起来也有些不便(小倡议:他只能用内置的一个ImageView来实现这些性能,用起来比拟麻烦,咱们通常是依据Fresco本人改改,间接应用他的Bitmap层)
4.3、各种json解析库应用
参考链接:https://www.cnblogs.com/kunpe...
(1)Google的Gson
Gson是目前性能最全的Json解析神器,Gson当初是为因应Google公司外部需要而由Google自行研发而来,但自从在2008年五月公开公布第一版后已被许多公司或用户利用。Gson的利用次要为toJson与fromJson两个转换函数,无依赖,不须要例外额定的jar,可能间接跑在JDK上。而在应用这种对象转换之前需先创立好对象的类型以及其成员能力胜利的将JSON字符串胜利转换成绝对应的对象。类外面只有有get和set办法,Gson齐全能够将简单类型的json到bean或bean到json的转换,是JSON解析的神器。Gson在性能下面无可挑剔,然而性能下面比FastJson有所差距。
(2)阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不须要例外额定的jar,可能间接跑在JDK上。FastJson在简单类型的Bean转换Json上会呈现一些问题,可能会呈现援用的类型,导致Json转换出错,须要制订援用。FastJson采纳独创的算法,将parse的速度晋升到极致,超过所有json库。
综上Json技术的比拟,在我的项目选型的时候能够应用Google的Gson和阿里巴巴的FastJson两种并行应用,如果只是性能要求,没有性能要求,能够应用google的Gson,如果有性能下面的要求能够应用Gson将bean转换json确保数据的正确,应用FastJson将Json转换Bean
点击下方链接收费获取Android进阶材料:
https://shimo.im/docs/tXXKHgdjPYj6WT8d/