史上最全的Android第三方库解析面试知识点集锦

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45258969/article/details/96481110

前言

很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。

下述是我整理的Android面试题汇总,由于篇幅原因,在这只把第三方库解析部分的题目列举出来,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多时间,有需要的朋友可以帮忙转发分享下,点个赞~

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>() { //进行异步请求
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        //进行异步操作
    }

    @Override
    public 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
        }
      });
}

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,如果你们是做美拍、爱拍这种视频类应用,建议使用。

Fresco在5.0以下的内存优化非常好,代价就是体积也非常的大,按体积算Fresco>Glide>Picasso

不过在使用起来也有些不便(小建议:他只能用内置的一个ImageView来实现这些功能,用起来比较麻烦,我们通常是根据Fresco自己改改,直接使用他的Bitmap层)

3.各种json解析库使用

(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第三方库解析部分的面试题目,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多时间,有需要的朋友可以帮忙转发分享下,点个赞~

漫漫Android开发之路,你我只是其中的一小部分……只有不断的学习、进阶,才是我们的出路!才跟得上时代的进步!

这边我整理了一些资料,把它拿出来分享给大家,一方面是希望能够帮助大家提高,一方面也是警醒自己,要不断学习、不断提升,进阶才是王道!

分享给大家的资料包括高级架构技术进阶脑图Android开发面试专题资料,还有高级进阶架构资料包括但不限于【高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术】希望能帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也是可以分享给身边好友一起学习的!

关注微信公众号【Android开发之家】获取小编为大家收录整理的资料
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

展开阅读全文

史上最全的前端面试总结

10-22

史上最全的前端面试总结rn整理来源于[url=http://www.xttblog.com/?p=880]业余草[/url]:[url=http://www.xttblog.com/?p=880]http://www.xttblog.com/?p=880[/url]rn你如何理解HTML结构的语意化rn去掉或样式丢失的时候能让页面呈现清晰的结构;rn屏幕阅读器(如果访客有视障)会完全根据你的标记来“读”你的网页;rnPDA、手机等设备可能无法像普通电脑的浏览器一样来渲染网页(通常是因为这些设备对rnCSS的支持较弱);rn搜索引擎的爬虫也依赖于标记来确定上下文和各个关键字的权重;rn你的页面是否对爬虫容易理解非常重要,因为爬虫很大程度上会忽略用于表现的标记,而只注重语义标记;rn便于团队开发和维护。rnDoctype文档声明的严格模式和混杂模式,如何触发这两种模式,区分它们有何意义rn如何触发两种模式rn加入xml头部声明,可以触发IE浏览器的Quirks mode,触发之后,浏览器解析方式就和IE5.5一样,拥有IE5.5一样的bug和其他问题,行为(JavaScript)也是如此。 rnIE6的触发:在XHTML的DOCTYPE前加入XML声明rnrnrnIE7的触发:在XML声明和XHTML的DOCTYPE之间,加入HTML注释rnrnrnrnIE6和IE7都可以触发的:在HTML4.01的DOCTYPE文档头部,加入HTML注释rn rn在页面顶部加 ,将触发“怪异模式”rn没有使用DTD声明或者使用HTML4以下(不包括HTML4)的DTD声明时,基本上所有的浏览器都是使用quirks mode呈现rn.....rn.....rn.....rn鉴于内容的篇幅问题,总结这篇文章中包含以下内容知识点!rn[b]谈谈以前端角度出发做好SEO需要考虑什么?[/b]rn[b]我们知道可以以外链的方式引入CSS文件,请谈谈外链引入CSS有哪些方式,这些方式的性能有区别吗[/b]rn[b]CSS Sprite是什么,谈谈这个技术的优缺点[/b]rn[b]行内元素有哪些?块级元素有哪些?CSS的盒模型[/b]rn[b]前端页面有哪三层构成,分别是什么?作用是什么[/b]rn[b]html中form里action方法的get和post有什么区别rnhtml元素的id跟class什么区别rnAjax是什么rn你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?经常遇到的浏览器的兼容性有哪些?怎么会出现?解决方法是什么?rnHTML5 离线存储rniframe的优缺点rnCSS盒模型原理[/b]rn整理来源于[url=http://www.xttblog.com/?p=880]业余草[/url]:[url=http://www.xttblog.com/?p=880]http://www.xttblog.com/?p=880[/url] 论坛

史上最全android开发资料大集合

06-04

这个可是我从各处搜集来的资料,上传到了我的资源里,供大家下载学习,希望大家支持一下rn1、【eoeAndroid特刊】第一期 Andriod 1.5 SDK简介 [url=http://download.csdn.net/source/2399809][/url]rnrn2、【eoeAndroid特刊】第二期 图像处理篇(1) [url=http://download.csdn.net/source/2399814][/url]rnrn3、【eoeAndroid特刊】第三期 Android Market及应用发布 [url=http://download.csdn.net/source/2399818][/url]rnrn4、【eoeAndroid特刊】第五期 Android widget [url=http://download.csdn.net/source/2399825][/url]rnrn5、【eoeAndroid特刊】第六期 数据通信-成为Android数据流大师 [url=http://download.csdn.net/source/2399830][/url]rnrn6、【eoeAndroid特刊】第七期 NDK [url=http://download.csdn.net/source/2400070][/url]rnrn7、【eoeAndroid特刊】第八期 数据存储操作 [url=http://download.csdn.net/source/2399834][/url]rnrn8、【eoeAndroid特刊】第八期+ 开发技巧 [url=http://download.csdn.net/source/2399841][/url]rnrn9、【eoeAndroid特刊】第九期 [url=http://download.csdn.net/source/2400075][/url]rnrn10、android开发教程 [url=http://download.csdn.net/source/2400084][/url]rnrn11、android基础教程 [url=http://download.csdn.net/source/2425923][/url]rnrn12、Google手机开发《Android.A.Programmers.Guide》 [url=http://download.csdn.net/source/2425883][/url]rnrn13、Professional.Android.Application.Development.2009 [url=http://download.csdn.net/source/2425899][/url]rnrn14、Apress.Android.Essentials.Jul.2008 [url=http://download.csdn.net/source/2425905][/url]rnrn15、android开发入门与实践 [url=http://download.csdn.net/source/2425931][/url]rnrn16、android开发入门与实践源代码 [url=http://download.csdn.net/source/2425935][/url]rnrn17、Android应用框架原理和程序设计 [url=http://download.csdn.net/source/2399790][/url]rnrn18、android JNI 简介与实现 [url=http://download.csdn.net/source/2425864][/url]rnrn19、Android开发指南中文版 rnrn20、android ADT-0.9.6 [url=http://download.csdn.net/source/2399804][/url]rnrn21、android-sdk2.2 [url=http://developer.android.com/sdk/android-2.2.html][/url] rnrnrn另外附视频资源网址rn《Google Android开发入门与实战随书视频》WMV[压缩包] [url=http://www.verycd.com/topics/2779532/][/url] 论坛

没有更多推荐了,返回首页