写点什么

Android 第三方库解析

用户头像
Android架构
关注
发布于: 16 小时前

public interface NetApi { @GET("repos/{owner}/{repo}/contributors") Call 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);//第三步:调用网络请求的接口获取网络请求 retrofit


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


2.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 执行的原理如下:


  • 首先,通过 method 把它转换成 ServiceMethod。

  • 然后,通过 serviceMethod,args 获取到 okHttpCall 对象。

  • 最后,再把 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}});}


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


介绍:


**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 区了。


总结:


Picasso 所能实现的功能,Glide 都能做,无非是所需的设置不同。但是 Picasso 体积比起 Glide 小太多如果项目中网络请求本身用的就是 okhttp 或者 retrofit(本质还是 okhttp),那么建议用 Picasso,体积会小很多(Square 全家桶的干活)。Glide 的好处是大型的图片流,比如 gif、Video,如果你们是做美拍、爱拍这种视频类应用,建议使用。

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android第三方库解析