美文网首页面试宝典Android 开发经验集android面试资料
Android面试一天一题(Day 40:标配RxJava+Re

Android面试一天一题(Day 40:标配RxJava+Re

作者: goeasyway | 来源:发表于2017-04-25 11:13 被阅读6070次

    这近两年RxJava和Retrofit都很热门,Android SDK4.4版本后其HttpURLConnection的内部实现已经变为OkHttp,很多公司也在开始尝试使用RxJava+Retrofit+OkHttp组合做为应用框架的根基。网上这类教程也遍地开花,不管是工作几年的Android工程师们,还是在象牙塔中的准工程师们都把“RxJava+Retrofit+OkHttp的组合”定为了自己的标配。

    不过问题也就来了,如果大家的框架都是同一个组合,那么面试官怎么考察不同的面试者对这个框架的理解和应用呢?或者换一个角度说,你作为面试者,怎么样在简历或者面试中体现你对“标配”的理解和运用,来突出自己呢?

    面试题:你是怎么搭建Android应用框架的?

    如果问这样的面试题,我想(我也试过)很多人都会回答上面所说的“标配”组合,顶多再加下MVP或者MVVM模式,然后就构成了一个比较流行的应用框架。

    不可否认这确实是一个不错的选择,那么如果是我们在整合这些库和模式成为一个框架,我们是基于什么样的原则选择它们的呢?

    RxJava
    给我们的项目引入响应式编程方式,让异步方式变得更简洁,而且它的简洁与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。它流式编程的思想,丰富的操作符,线程的任意切换等优点广受大家的喜爱。

    响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

    Retrofit
    Retrofit是一个RESTful的Http网络请求框架的封装。注意这里并没有说它是网络请求框架,主要原因在于网络请求的工作并不是Retrofit来完成的。

    Retrofit 2.0开始内置OkHttp,前者专注于接口的封装,后者专注于网络请求的高效,二者分工协作。

    而且Retrofit提供不同的Converter实现(也可以自定义),同时提供RxJava支持(返回Observable对象),配合Gson和RxJava,你可以用很少的代码就实现请求、返回数据解析和操作等功能。

    OkHttp
    OkHttp是Retrofit底层使用的Http请求库,都是Square公司的开源产品。OkHttp是一个快速、高效的Http客户端实现,它帮我们完成了很多很多事情:

    • 支持SPDY, 可以合并多个到同一个主机的请求
    • 使用连接池技术减少请求的延迟(如果SPDY是可用的话)
    • 使用GZIP压缩减少传输的数据量
    • 缓存响应避免重复的网络请求
    • ......

    OkHttp还提供了拦截器(Interceptors),方便我们来监控,改写和重试HTTP访问。通过拦截器,我们很容易就能实现对Http的请求和响应记录到日志。

    整合

    如果我们直接这样组合就认为是一个应用框架的话,那我认为你还没有真正认识框架,或者没有遇到稍大一点复杂一点的项目,所以你毫不费力就有了自己“高大上”的框架。

    但是在你整合这些库时,你更应该学习一下他们是怎么能无缝地对接上的,这一点也是我认为可以问面试者的一个重要的点。

    如Retrofit的解耦方式:

    1、通过注解来配置请求参数;

    2、通过工厂来生成CallAdapter,Converter。

    • 你可以使用不同的请求适配器(CallAdapter),比如RxJava;
    • 你可以使用不同的反序列化工具(Converter),比如Gson、protobuff等。
    Retrofit retrofit = new Retrofit.Builder()
      .baseUrl("http://api.github.com/api/")
      .addConverterFactory(GsonConverterFactory.create())
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
      .build();
    

    Retrofit是如何做到的呢?其间的实现代码值得好好看看,好在代码量并不是很大,看前先学习一个Java动态代理方面的知识,也可缓解一些“痛苦”。

    所以总结果一下,关于标配我会这样问:RxJava+Retrofit+OkHttp的内部是如何整合在一起的,还有就是它们如何和数据与业务逻辑层进行整合?

    看大家的热情,也许稍后会就这个整合进行案列展示。

    小结

    很多面试者只是把“RxJava+Retrofit+OkHttp”的使用做为标配了,即使你用了这个组合,它对于自身的技能或者架构能力提升其实并不大,相反因为太容易了,而且封装得比较好还会减少你遇到问题的机会,当然也会让你失去提升的机会。

    所以,我关注怎么整合它们,并学会他们整合在一起的具体方法和手段。

    相关面试题
    1、MVP和MVVM模式:
    “Android面试一天一题(Day 33:Android开发的套路MVP & MVVM)”
    2、第三方开源库:
    “Android面试一天一题(Day 32:谈谈使用过的第三方开源库)”

    相关文章

      网友评论

      • bc1ff59c5b30:我就觉得楼主的启发性讲解挺好的。楼主是提供一个思考的方向,思维模式的转变很多人都做不到。如果我们只是单纯的想要问题的答案,那真正学到的东西也不会是深刻的。还是需要自己思考得出答案。楼主加油,授人以渔比较重要
      • 1f714d8d5791:我使用Rxjava的最大理由就是不想写if else嵌套和handler
      • 1f714d8d5791:怎么剖析?这个组合里估计源代码能看懂的也就是Retrofit框架了。OkHttp我可以肯定很大一部分的面试官都不一定懂。让他写个这样的库出来估计也够呛。RxJava同理。
      • bigeason:我大致看了一下您写的关于面试的文章 看完之后给我的印象就是一句话 说了跟没说一样,原谅我这么直接,但是确实如此,比如你自己写一个面试的题目,奇怪的是你并不给这个题目答案,而是说了一大堆其他的废话 对于我们来说只是想看看这道题目的答案然后就是遇到了这类问题应该如何作答而已 真的是浪费我的时间 再次原谅我这么直接
        1f714d8d5791:面试最怕的就是碰到不是做这行的或者面试官本身也是半吊子的这种。问问题也是门技术。
        1f714d8d5791:一般公司面试取决于面试官会什么。其实只要把自己工作用到的东西大体搞清楚了。怎么问都不怕,肯定有话说。比如你用了Glide库,只要你真的研究了它的实现原理。就这个库里都可以聊上很久。这个库就包含了很多知识点。不过我没看过。挺复杂的。现在在看okhttp的实现。
        goeasyway: @bigeason 每人写作的目的和阅读对象是不同的,你想要的方式很好,我可能会做一些改善。感谢你花了时间关注。
      • StevenCheuk:可以更详细地剖析吗?或者有写得深入点的文章推荐一下?真心有点懵:sweat:
        W_BinaryTree:仅仅是RxJava 可以看下我的文章。但是和retrofit结合的我并没有写过。
      • W_BinaryTree:我觉得很多人对RxJava有误解。 很多文章甚至写什么RxJava是网络请求库,线程调度库。或者自己的App里 就仅仅有Retrofit部分用到了RxJava,或者仅仅用了一个RxBus。就写上RxJava + MVP + etc.
        1f714d8d5791:中文的文章抄的很多。人云亦云。比如很多文章都说显示一个dialog的时候,activity会调用onPause()方法。官网说的是这个dialog是用activity写的。才会调用
        Hi_Felix:@W_BinaryTree 哈哈哈:smile:

      本文标题:Android面试一天一题(Day 40:标配RxJava+Re

      本文链接:https://www.haomeiwen.com/subject/vhfvzttx.html