前言很多人在面试之前可能没有在互联网公司工作过,或者工作过很短的时间。不知道互联网公司技术面试都会问什么问题?再加上他们可能准备不够充分,几轮面试下来就被面试官的几个问题搞糊涂了,最后以惨败告终。1、Retrofit网络请求框架的概念:Retrofit是对一个基于RESTful的HTTP网络请求框架的封装,其中网络请求的本质是由OKHttp完成的,Retrofit只负责网络请求接口的封装。原理:App应用通过Retrofit请求网络。其实Retrofit接口层就是用来封装请求参数,Header,URL等信息,然后OKHttp完成后续请求的。服务器返回数据后,OKHttp将原始结果传递给Retrofit。最后根据用户的需求对结果进行分析。Retrofit使用1.在retrofit中,使用一个接口作为http请求的api接口publicinterfaceNetApi{@GET("repos/{owner}/{repo}/contributors")调用contributorsBySimpleGetCall(@Path("owner")Stringowner,@Path("repo")Stringrepo);}2.创建Retrofit实例Retrofitretrofit=newRetrofit.Builder().baseUrl("https://api.github.com/").build();3.调用api接口NetApirepo=retrofit.create(NetApi.class);//第三步:调用网络请求接口获取网络请求retrofit2.Callcall=repo.contributorsBySimpleGetCall("username","path");call.enqueue(newCallback(){//异步请求@OverridepublicvoidonResponse(Callcall,Responseresponse){//异步操作}@OverridepublicvoidonFailure(Callcall,Throwablet){//执行错误回调方法}});retrofit动态代理retrofit执行的原理如下:首先通过method转换成ServiceMethod。然后,通过serviceMethod,args获取okHttpCall对象。最后进一步封装okHttpCall,返回Call对象。首先创建retrofit对象的方法如下:Retrofitretrofit=newRetrofit.Builder().baseUrl("https://api.github.com/").build();build()方法在创建改造对象时使用。该方法的实现如下:newOkHttpClient();//设置kHttpClient}ExecutorcallbackExecutor=this.callbackExecutor;if(callbackExecutor==null){callbackExecutor=platform.defaultCallbackExecutor();//设置默认回调执行器}//创建适配器的防御副本并添加默认Calladapter.ListadapterFact>(this.adapterFactories);adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));//制作转换器的防御副本。ListconverterFactories=newArrayList<>(this.converterFactories);returnnewRetrofit(callFactory,baseUrls,转换器回调执行器,validateEagerly);//返回新创建的Retrofit对象}该方法返回一个Retrofit对象,通过retrofit对象创建网络请求接口的方式如下:NetApirepo=retrofit.create(NetApi.class);retrofit对象的create()方法的实现如下:publicTcreate(finalClassservice){Utils.validateServiceInterface(service);if(validateEagerly){eagerlyValidateMethods(service);}return(T)Proxy.newProxyInstance(service.getClassLoader(),newClass>[]{service},newInvocationHandler(){privatefinalPlatformplatform=Platform.get();@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object...args)throwsThrowable{//ifthemethodismethodfromObjectthendefertonormalinvocation.if(method.getDeclaringClass()==Object.class){returnmethod.invoke(this,args);//直接调用方法}if(platform.isDefaultMethod(method)){returnplatform.invokeDefaultMethod(method,service,proxy,args);//通过平台对象调用方法}ServiceMethodserviceMethod=loadServiceMethod(method);//获取ServiceMethod对象OkH??ttpCallokHttpCall=newOkHttpCall<>(serviceMethod,args);//传入参数生成okHttpCall对象返回服务方法。callAdapter.adapt(okHttpCall);//执行okHttpCall}});}2.图片加载库对比Picasso:120KGlide:475KFresco:3.4MAndroid-Universal-Image-Loader:162K图片函数库选择需要根据APP的具体情况,对于壁纸、图片社交类APP等严重依赖图片缓存的APP,可以选择最专业的Fresco。这。按照APP对图片显示和缓存的需求从低到高,我们可以对以上函数库进行排序。PicassoGlide>Picasso用起来也有些不方便(小建议:他只能用一个内置的ImageView来实现这些功能,用起来比较麻烦,我们一般都是按照Fresco修改,和直接使用他的Bitmap层)3.各种json解析库的使用(1)谷歌的GsonGson是目前功能最全的Json解析神器,Gson本来是为了响应式的,由于谷歌内部需求,谷歌自己开发的,但是它有自2008年5月第一个版本公开发布以来,已经被很多公司或用户使用。Gson的应用主要包括两个转换函数,toJson和fromJson。它没有依赖,不需要额外的jar,可以直接在JDK上运行。在使用这个对象转换之前,需要先创建对象类型及其成员,才能成功将JSON字符串转换成对应的对象。只要类中有get和set方法,Gson就可以完全将复杂类型的json转bean或bean转json,堪称JSON解析的神器。Gson在功能上无可挑剔,但性能上与FastJson有些差距。(2)阿里巴巴的FastJsonFastjson是阿里巴巴开发的一款用Java编写的高性能JSON处理器。没有依赖,不需要额外的jar,可以直接在JDK上运行。FastJson在转换复杂类型bean的Json时会出现一些问题。可能存在引用类型,会导致Json转换出错,需要制定引用。FastJson采用独创算法,将解析速度提升到极致,超越所有json库。总结一下Json技术的对比,谷歌的Gson和阿里巴巴的FastJson可以并列用于项目选择。如果只有功能需求,没有性能需求,可以使用谷歌的Gson。如果有性能要求,可以使用。使用Gson将bean转json保证数据的正确性,使用FastJson将Json转bean