开源框架解析系列
文章平均质量分 87
本系列主要分享目前主流框架的用法和源码解析,理解开源的设计思路。
珠穆朗玛小王子
又是一个新的开始
展开
-
Gson踩坑笔记:为什么对象的构造方法没有被执行?
前言最近做项目遇到了一个很奇怪的问题,情况如下:创建对象TestBean,其中type和name需要接口返回并解析,time字段需要客户端修改,做一些必要的记录,希望time的默认值为10:val jsonStr ="{type: 99, name:\"superman\"}"data class TestBean(val type: Int, val name: String, var time: Long = 10)在运行前,我认为这段代码非常完美,但是结果却很意外:难道Gson把构造原创 2020-10-26 18:32:47 · 1252 阅读 · 0 评论 -
Android:从零开始打造自己的深度链接库(一):ARouter简介
前言原计划这是一个系列的收费文章,2块钱买不了吃亏买不了上当,结果没想到预订人数还没到10人,略微有些尴尬。虽然结局不太完美,但是也反映出大家的水平大部分都在这篇文章的水平之上了,我也可以把文章拆分成多个部分慢慢写了,也是好事一件。在应用开发中,原生app经常内嵌Web,节省开发的成本,这种情况我们通过注入JS脚本来解决原生和Web的通信问题。那么相反,在浏览器环境中,Web又如何启动App呢...原创 2019-03-07 18:21:33 · 994 阅读 · 0 评论 -
Android:从零开始打造自己的深度链接库(二):ARouter源码解析
前言这一篇我们来具体看一下ARouter的实现原理,如果你之前没有接触过ARouter,可以先阅读上一篇:Android:从零开始打造自己的深度链接库(一):ARouter简介废话不多,我们赶紧分析源码。正文首先我们从github下载最新的源码:被选中的三个Module是我们今天分析的重点:arouter-annotation从名称看我们可以猜到这是自定义注解的库,我们就直接截个...原创 2019-03-23 15:51:47 · 1027 阅读 · 0 评论 -
Android:从零开始打造自己的深度链接库(三):自定义XML协议
前言之前我们把ARouter的原理分析了一遍,如果你是刚启动的新项目,建议立刻使用,哪天运营有这个需求了,你就可以牛逼的对他说,我早就已经做好了。但是老项目就会有一丢丢的尴尬,所以我们要在ARouter的基础上,独立深度链接的功能,然后打造出加强版的深度链接库,我起名为DeepLinkSo。正文回顾一下ARouter的源码,我们记得他使用的是自定义注解,完成路由的注册和绑定。注解看上去高大...原创 2019-04-09 17:15:42 · 527 阅读 · 0 评论 -
Android:从零开始打造自己的深度链接库(四):DeepLinkSo实战
前言今天是这个系列的最后一篇,如果你还看过之前的内容,可以先阅读: Android:从零开始打造自己的深度链接库(一):ARouter简介Android:从零开始打造自己的深度链接库(二):ARouter源码解析Android:从零开始打造自己的深度链接库(三):自定义XML协议我们将借鉴ARouter的开发思路,扩展新的功能。上一篇我们已经订好了XML协议,并且把XML中的内容,保存到...原创 2019-04-27 12:18:40 · 699 阅读 · 0 评论 -
Retrofit源码解析(一):基础使用
前言才发现已经有一个月没更新博客了,上个月发布了两篇Chat:线性布局和相对布局的实现原理我的安卓生涯:从6k到25K,都经历了什么都是高质量的内容和技术分享,所以占用了比较多的时间,感兴趣的朋友可以支持一下我的创作,十分感谢~今天准备跟大家分享一下Retrofit的用法和源码的实现原理。Retrofit是对Okhttp的二次封装的开源库,目的是让okhttp使用起来更方便,更...原创 2018-08-29 12:38:14 · 746 阅读 · 0 评论 -
Retrofit源码解析(二):源码解析
前言之前我们已经复习了Retrofit的基础用法,Retrofit的源码理解并不复杂,他实现的主要功能就是把接口文件通过注解转化成Okhttp请求,所以我们弄懂了主线,整个Retrofit我们就明白了。正文首先复习一下Retrofit的用法:val retrofit = Retrofit.Builder() // 必填项 ...原创 2018-08-29 15:44:03 · 479 阅读 · 0 评论 -
okhttp源码解析(一):整体分析
前言现在最流行的网络框架是什么?那肯定是okhttp,它开源已经有很长一段时间了,一直都是开发者们的最爱,例如目前最流行的:Rxjava + Retrofit + okhttp,都是以okhttp作为网络层实现的基础,图片加载框架Fresco,也支持设置okhttp为网络层,为什么大家都为okhttp一路绿灯?不用怀疑,肯定是okhttp过硬的技术实力,现在我们就来了解一下okhttp的源码。正文...原创 2018-04-20 18:37:23 · 754 阅读 · 2 评论 -
okhttp源码解析(二):网路数据的读取
前言上一篇我们整体分析了一下okhttp的网络请求从发起到结束的流程,因为省略了很多的细节,所以还是很容易理解的,今天我们来重点分析一下okhttp是怎么从网络读取数据的。之前提到过,okhttp的封装是非常仔细的,他使用okio框架来读取数据,这次分析okio的内容并不在我们的分析范围之内,不了解的朋友可以自己去学习一下。正文上一篇我们最后分析到了Interceptors的递归,完成了整个网络请...原创 2018-04-28 18:26:12 · 891 阅读 · 0 评论 -
okhttp源码解析(三):缓存机制
前言研究完自定义View,我们接着看okhttp的源码,之前已经讨论了okhttp的使用流程,和网络数据的读取,这一次来看一看okhttp的缓存机制。正文首先我们回到之前已经阅读过的InterceptorChain,RealCall.java中的getResponseWithInterceptorChain()方法:Response getResponseWithIntercep...原创 2018-07-24 17:10:15 · 749 阅读 · 0 评论 -
okhttp源码解析(四):重试机制
前言这一篇我们分析okhttp的重试机制,一般如果网络请求失败,我们会考虑连续请求多次,增大网络请求成功的概率,那么okhttp是怎么实现这个功能的呢?正文首先还是回到之前的InterceptorChain:Response getResponseWithInterceptorChain() throws IOException { // Build a full sta...原创 2018-07-25 15:33:57 · 7006 阅读 · 0 评论 -
okhttp源码解析(五):代理和DNS
前言之前我们分析了okhttp的重试机制,发现在获取可用地址的时候,都需要遍历一个路由选择器,里面保存了可用的地址,那么这些地址是从哪来的呢?这就是本篇分析的重点。首先我们简单理解一下代理和DNS的概念:代理:通过另一台服务器或ip,帮助我们进行网络请求的转发,例如创建的抓包工具。DNS:万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,...原创 2018-07-31 16:12:56 · 5546 阅读 · 0 评论 -
开源框架推荐:网速监听—facebook/network-connection-class
前言昨天发生了一点小插曲,首次使用litepal(数据库框架)竟然没有建表,结果最后发现原因是:之前是afinal,版本号为1,现在使用litepal,如果数据库的名称一样,不提升版本号 是无法建表的,在这里也是提醒同样使用litepal的朋友,别跟我犯同样的错误。这也是要临近下班的时间了,准备给大家推荐一款很使用的开源框架:Facebook开源的network-connection-class,检原创 2017-06-22 19:07:56 · 3271 阅读 · 0 评论 -
开源框架源码分析:网速监听—facebook/network-connection-class
前言上一篇跟大家推荐了一个监听网速的开源框架,所以就研究了一下开源的代码,没想到会这么简单,原本以为要多看一阵才能写出来,所以今天我们就来聊聊facebook/network-connection-class的源码。正文源码连接:https://github.com/facebook/network-connection-class/我们从github上直接下载zip,然后引入到Android st原创 2017-06-26 17:54:26 · 2463 阅读 · 0 评论 -
EventBus源码分析(一):EventBus的使用
前言之前在聊观察者模式的时候说过之后要来个EventBus的源码分析,今天就开始补上。首先我们做一点准备工作: 1、下载EventBus的源码,https://github.com/greenrobot/EventBus。 2、下载完毕之后导入到Android Studio,你会看到总共有5个工程,别惊讶,其实有两个是测试工程,这里我们不需要,你可以删掉。最后只保留了三个工程,Event原创 2017-08-29 15:12:17 · 415 阅读 · 0 评论 -
EventBus源码分析(二):编译库源码解析
前言本来想把EventBus的使用和编译库的分析一起说,但是觉得篇幅有点太大了,编译库的东西虽然不多也不复杂,但是还是有很多能学习到的东西。在上一篇已经建议大家对apt 和注解的使用有了一定的了解之后再来,否则你可能看的一脸懵逼,如果你还接触他们,可以先看一下我之前写的博客:注解(Annotation)的基本了解 正文使用apt编译工具,主要是实现process(Set@Override p原创 2017-08-29 17:10:00 · 526 阅读 · 0 评论 -
EventBus源码分析(三): 注册和解绑的源码分析
前言为了让文章的篇幅保持一个短小精悍的程度,所以决定把EventBus的分析拆分成:注册解绑和发送Event的处理过程两部分。今天来看看注册解绑是怎么操作的。正文EventBus首先需要注册,才能得到Event的响应,这里省略了某些类的源码,直接看过程:/** * 这里来注册广播,并且提示接收Event的方法必须被Subscribe注解 * */ public void原创 2017-08-31 15:38:39 · 465 阅读 · 0 评论 -
EventBus源码分析(四): 发送Event和响应注册的回调方法
前言今天是EventBus的最后一篇了,之前我们已经理解了EventBus的编译过程,以及如何注册和解绑Event,发送Event其实是在注册成功的基础上遍历的你需要的类和方法,相对于之前的几篇,今天的内容会相对轻松很多。正文发送Event有两种,一种是普通的Event,一种是StickyEvent。我们先看普通的Event,打开post方法:/** * 发送Event * *原创 2017-09-04 15:03:47 · 1223 阅读 · 0 评论 -
RxAndroid: 基础介绍(一)
前言在找工作的时候看到过有面试要求会RxJava + Retrofit,当时也没有太在意,正好新的工作中用的就是这个,也慢慢体会了一下,的确是不错,他的优点就是逻辑清晰,对象的加工和线程的切换都是傻瓜操作,不得不说他火的有道理。正文概念性的东西就不说了,RxAndroid是RxJava在Android平台的一个版本,实现的功能几乎都是一样的。我在使用的都是都是2.0版本,跟低版本使用方法是有区别的,原创 2017-06-16 11:20:52 · 2709 阅读 · 0 评论 -
RxAndroid: 高级使用(二)
前言上一篇已经把一些基础的api都介绍了,这次再多聊一些api以及如何进行线程切换。正文首先我们来聊一聊线程切换的问题,例如最近非常流行的RxAndroid + Retrofit + OkHttp,典型的框架之间的结合使用,那么问题来了,Android是不允许在主线程发起的,没有线程切换那就肯定要蛋疼了,例如下面的伪代码:Observable<String>// 这些都在新线程里.map("对u原创 2017-06-20 18:23:31 · 471 阅读 · 0 评论 -
实现基于注解(Annotation)的数据库框架(一)反射的基本了解
前言前几天在研究一个Router(路由模式)的一个Demo,写的非常好,偶然发现里面用到了反射,觉得这个东西,应该拿出来写点东西。所以决定这个系列的的最终目标——自定义屌爆了的数据库框架:通过注解和反射去模仿最新流行的数据库框架模式,完成一个核心的Demo(只看核心思想,轻度考虑代码健壮的问题)。对于刚开始接触java的时候,我是非常反感反射的,一大堆不知道所云的代码,硬生生的破坏了原本的设计结构,转载 2017-03-14 12:04:33 · 687 阅读 · 0 评论 -
实现基于注解(Annotation)的数据库框架(二)注解(Annotation)的基本了解
前言这一篇来浅谈一下注解(Annotation),为之后的注解的学习打下一个良好的印象,消除对注解的恐惧。正文首先推荐一个博客的连接http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html,这篇博客对基础概念将的非常的好,我希望你先看完这篇博客,再继续往下看。看完了这么大篇幅的概念,我肯定是要懵逼了,有一种似懂非懂不可言传的感觉。自己总原创 2017-03-14 17:11:09 · 750 阅读 · 0 评论 -
实现基于注解(Annotation)的数据库框架(三)自定义注解(Annotation)
前言之前已经简单介绍了系统的内置注解,我们已经对注解有了一个初步的印象,接下来就来看看如何自定义注解。此文章仍然转载自上一篇的作者,因为他写的实在是太好了,非常适合刚接触注解的朋友去看,原文的连接地址 http://www.cnblogs.com/peida/archive/2013/04/24/3036689.html。正文元注解:元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的m转载 2017-03-15 10:56:55 · 1171 阅读 · 0 评论 -
实现基于注解(Annotation)的数据库框架(四)注解(Annotation)和反射的结合使用
前言反射和注解的基本知识我们都已经了解了,这一篇来具体看看他俩如何结合使用,离我们的最终目标越来越近了。正文现在来写一个通过注解来实现setContentView()的功能的Demo。首先我们需要自定义一个注解,我们命名为ContentView:package com.lzp.annotationstudy;import java.lang.annotation.ElementType;impor原创 2017-03-15 11:38:08 · 651 阅读 · 0 评论 -
实现基于注解(Annotation)的数据库框架(五)最终的实战
前言经过对基础知识的学习和积累,终于到了最后的实战,自定义数据库框架。框架的使用方法是参考一些流行的数据库框架,例如Litepal。正文首先,我们来梳理一下我们这个框架的流程图:首先从数据库的初始化开始,我们先定义xml的解析格式:<?xml version="1.0" encoding="utf-8"?><sqlframe> <!-- 数据库名称 --> <name>Test</n原创 2017-03-15 15:18:28 · 1225 阅读 · 0 评论 -
深入理解编译注解(一)从实战理解什么是编译注解
前言之前我们已经理解了什么是运行时注解,并且实现了一个含金量较高的数据库框架,同时我们也发现,使用反射会使运行的效率的变低,很多流行的注解框架已经考虑用编译注解来解决这个问题,今天我们用编译注解的形式来实现setContentView和findViewById。正文首先,我们来弄清楚使用编译注解的目的和优缺点: 编译注解主要是在编译过程中,生成必要的文件,这样在运行时调用,就不需要再通过大量的反原创 2017-03-21 13:06:09 · 3092 阅读 · 3 评论 -
深入理解编译注解(二)annotationProcessor与android-apt
前言之前我们已经实际感受了编译注解的使用,虽然操作起来稍微复杂一些,但是提高了程序运行的效率,用户体验会更好,作为开发者来说,这点牺牲还是值得的。在demo中使用了annotationProcessor来表明程序之间是编译关系,这一篇来仔细的了解一下annotationProcessor。正文什么是APT?APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码原创 2017-03-21 14:13:54 · 11544 阅读 · 6 评论 -
深入理解编译注解(三)依赖关系 apt/annotationProcessor与Provided的区别
前言网上有很多朋友在问: apt/annotationProcessor与Provided 都是只编译并不打入apk中,他俩到底有什么区别呢?所以我就把自己所了解的与大家分享一下。正文编译关系 apt/annotationProcessor只在编译的时候执行依赖的库,但是库最终不打包到apk中,从之前的demo来看,总结一下: 编译库中的代码没有直接使用的意义,也没有提供开放的api调用,最终的原创 2017-03-21 16:36:01 · 3670 阅读 · 4 评论 -
深入理解编译注解(四)常用接口介绍
前言今天猛然想起一个注解在使用上的问题,就一直在网上搜索资料,问题倒是没解决,但是看到了一篇非常好的博客,正好是我这里缺少的,写的很不错,所以直接转载。在之前的demo中,为了完成编译注解的功能,我们引入了com.google.auto.service:auto-service:1.0-rc2,这篇博客就是重点介绍了里面的api。原文博客链接:http://blog.csdn.net/github_转载 2017-03-22 12:19:12 · 2898 阅读 · 0 评论 -
深入理解编译注解(五)RetentionPolicy.SOURCE 和 RetentionPolicy.CLASS区别讨论
前言这篇我觉得应该是一个讨论篇,因为我自己还没有找到一个非常满意的答案,希望大家一起来讨论。正文元注解RetentionPolicy,表明注解的生命周期: 1、SOURCE:在原文件中有效,被编译器丢弃。 2、CLASS:在class文件有效,可能会被虚拟机忽略。 3、RUNTIME:在运行时有效。RUNTIME肯定没有意见,因为只有他能够在运行时得到注解,例如之前的数据库框架。那原创 2017-03-22 14:19:06 · 18796 阅读 · 6 评论 -
深入理解编译注解(六)Butterknife的实现原理
前言我们已经把基本知识都搞定了,也能够实现简单的功能。作为这个系列的最后一篇,我们来看看Butterknife的实现原理。Butterknife 的Github下载地址:https://github.com/JakeWharton/butterknife正文运行Demo也在下载的包中,大家自己运行看下效果就可以了。首先我们来看看整个工程的结构: 下载的源码中的工程还是不少的,但是图中被选中的蓝色工原创 2017-03-24 13:55:27 · 1793 阅读 · 0 评论 -
DataBinding 学习系列(1)基础知识的了解和使用
介绍DataBinding,2015年IO大会介绍的一个框架,是Google对MVVM在Android上的一种实现,可以直接数据绑定到xml中,并实现自动刷新。好处:去掉了大部分的UI相关代码(比如findViewById、 setOnClickListener、setText等)xml变成UI的唯一真实来源,数据绑定也直接发生在xml(更多可以在网上查询)配置网上有很多是以前的资料,现在基本上都是原创 2017-02-15 16:08:06 · 1053 阅读 · 0 评论 -
DataBinding 学习系列(2)详解DataBinding在xml中的使用
前言上一篇简单的介绍了DataBinding的用法,这几篇来仔细的介绍一下的功能。data 标签 的功能<data class="test"></data>class 属性生成指定的名称的Binding对象。什么是Bind对象呢?来回顾之前的一句代码ViewDataBinding mBinder = DataBindingUtil.setContentView(this, R.layout.acti原创 2017-02-17 18:09:47 · 7871 阅读 · 0 评论 -
DataBinding 学习系列(3)新增的可见字段来编写对象(bean)
前言之前主要都是在讲DataBinding在xml中的使用,基本上满足了大部分的需求了,但是不能放下前进的脚步,了解和使用DataBinding中的可见字段,绝对是一件锦上添花的事情。实战首先来看一下之前的User代码/** * Created by li.zhipeng on 2017/2/10. * * 测试用的User类 */public class User { pr原创 2017-02-20 18:33:49 · 680 阅读 · 0 评论 -
DataBinding 学习系列(4)DataBinding的高级功能
前言前几篇已经DataBinding的基础用法已经介绍的差不多了,所以接下来感受一下DataBinding强大的高级功能。正文DataBinding可以通过注解,实现很多强大的功能,并且十分的方便,能够帮助我们省去大量的对xml进行操作的代码,例如加载图片,字符串处理等等操作。@BindingConversion 自定义类型转换<ImageView android:layout_width原创 2017-02-23 14:52:11 · 8931 阅读 · 1 评论 -
DataBinding 学习系列(5)细节上的概念强化和扩展
前言之前已经把大部分的应用都已经介绍了,现在就把一些在概念上和应用上的细节再恶补一下。正文Lambda 表达式之前我们在xml中已经掌握了如果使用variable的对象中的方法:<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClic原创 2017-02-28 11:37:01 · 687 阅读 · 0 评论