<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zhangke]]></title><description><![CDATA[巧者劳，智者忧，唯无能者无所求。]]></description><link>https://blog.youkuaiyun.com/kaifa1321</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; kaifa1321]]></copyright><item><title><![CDATA[RxJava源码分析(2) 变换原理]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428205</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428205</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:35:34 +0800</pubDate><description><![CDATA[
  RxJava源码分析基于RxJava1.3.8。


在上一章节中，主要介绍了RxJava的基本使用并对该部分的源码做了详细分析。在这一章节中，将主要介绍RxJava的另一大核心功能：变换。


  变换，就是将事件序列中的对象或整个序列进行加工处理，转换成不同的事件或事件序列。


在RxJava中，提供了许多针对不同场景实现变换功能的操作符，如下：


map() 
flatMap(),...]]></description><category></category></item><item><title><![CDATA[RxJava源码分析]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428183</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428183</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:32:40 +0800</pubDate><description><![CDATA[
  RxJava源码分析基于RxJava1.3.8。





  题外话： 
  在写这边博客之前曾犹豫过很久，因为RxJava的源码非常复杂，感觉不是在一两篇博客中就能讲解清楚。但是正式因为RxJava的源码非常复杂，我也想通过写博客的方式来加深自己对RxJava源码的认识，同时也算是做笔记了，能时不时的翻出来看看，以防止忘记。




概述

虽然RxJava2也发布了很长时间了，但是对于...]]></description><category></category></item><item><title><![CDATA[Retrofit2源码分析(2) CallAdapter详解]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428150</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428150</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:30:02 +0800</pubDate><description><![CDATA[
  Retrofit源码分析基于2.4.0。


本章节中将对Retrofit2中的CallAdapter机制做详细讲解。

在上一章节中曾提到了Call对象的创建是通过是通过ServiceMethod.adapt()完成的，这里在看看该方法的源码：

ServiceMethod.adapt()方法：



  T adapt(Call&amp;lt;R&amp;gt; call) {
    return c...]]></description><category></category></item><item><title><![CDATA[Retrofit2源码分析]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428144</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428144</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:29:11 +0800</pubDate><description><![CDATA[
  Retrofit源码分析基于2.4.0。


关于Retrofit的基本使用可以参照 Retrofit官网。

Retrofit是Java及Android平台上类型安全的Http客户端。这是官方给出关于Retrofit的简介。

这里需要明确：Retrofit只是一个Http网络请求封装库，该库的主要工作是对网络请求进行封装，最终实现网络请求的操作是由Okhttp完成的。



基本使用

...]]></description><category></category></item><item><title><![CDATA[Okhttp3源码分析(3) Interceptor拦截器]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428107</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428107</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:26:15 +0800</pubDate><description><![CDATA[
  okhttp3源码分析基于okhttp3.10.0。


在前面章节里提到过，okhttp不管是同步请求还是异步请求，最终都是通过RealCall.getResponseWithInterceptorChain()方法获取请求响应的，该方法的核心功能就是要在本章节介绍的okhttp的Interceptor拦截器的工作机制。

Interceptor介绍

关于okhttp的Intercept...]]></description><category></category></item><item><title><![CDATA[Okhttp3源码分析(2) Dispatcher分发器]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428077</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428077</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:23:17 +0800</pubDate><description><![CDATA[
  okhttp3源码分析基于okhttp3.10.0。


在上一章节中提到在RealCall请求方法中，不管是同步请求方法execute()还是异步请求方法enqueue(CallBack)最终都会调用Dispatcher分发器的相关方法，所以这里对Dispatcher类做具体分析。



Dispatcher

Dispatcher，顾名思义就是分发器，主要的作用就是用于处理具体的网络请求...]]></description><category></category></item><item><title><![CDATA[Okhttp3源码分析]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/80428008</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/80428008</guid><author>kaifa1321</author><pubDate>Wed, 23 May 2018 23:21:28 +0800</pubDate><description><![CDATA[关于okhttp的特点及相关功能的介绍可以查看官网的介绍：


http://square.github.io/okhttp/
https://github.com/square/okhttp/wiki




基本使用

使用okhttp发起一次网络请求，只需要以下流程即可:


创建OkHttpClient
创建Request对象
创建一个Call对象，用于发起请求
发起网络请求（同步请求ex...]]></description><category></category></item><item><title><![CDATA[UML 类图和时序图]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/79914014</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/79914014</guid><author>kaifa1321</author><pubDate>Thu, 12 Apr 2018 15:04:09 +0800</pubDate><description><![CDATA[UML类图

在UML类图中，常见的有以下几种关系: 泛化（Generalization）,  实现（Realization）, 关联（Association), 聚合（Aggregation）, 组合(Composition), 依赖(Dependency)

泛化（Generalization）

【泛化关系】：是一种继承关系, 表示一般与特殊的关系, 它指定了子类如何特化父类的所有特征和行为...]]></description><category></category></item><item><title><![CDATA[EventBus3.0 性能提升之添加索引]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/79761507</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/79761507</guid><author>kaifa1321</author><pubDate>Fri, 30 Mar 2018 18:18:15 +0800</pubDate><description><![CDATA[EventBus3.0 源码解析 一文中，在分析Subscriber的register()过程中，说到过一个方法方法findUsingReflectionInSingleClass，在该方法的作用是在RunTime期间通过反射获取Subscriber中的SubscriberMethod。

这样就会产生一个问题，在RunTime期间使用反射对程序运行的性能有较大影响。这里我们可以看看EventBu...]]></description><category></category></item><item><title><![CDATA[EventBus3.0 源码解析]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/79747145</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/79747145</guid><author>kaifa1321</author><pubDate>Thu, 29 Mar 2018 18:42:48 +0800</pubDate><description><![CDATA[EventBus，是一个基于Publish/Subscribe的事件总线框架。更通俗的讲，EventBus就是一个基于观察者模式的框架，但是EventBus在观察者模式的基础上有很大一部分改进，基本是实现了Publish/Subscribe的解耦。

这里主要对EventBus3.0的实现原理及源码进行分析，关于EventBus的具体用法，可以去GitHub具体查看，这里不做过多介绍。

通过对E...]]></description><category></category></item><item><title><![CDATA[Java AbstractProcessor实现自定义ButterKnife]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/79683246</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/79683246</guid><author>kaifa1321</author><pubDate>Tue, 27 Mar 2018 14:11:04 +0800</pubDate><description><![CDATA[在上一节中Java注解及自定义注解处理器，主要是说明了Java注解的基本用法以及通过反射在JVM运行时实现Java的注解处理器，同时也说明了通过反射实现注解处理器会对代码的运行性能有一定影响。

所以这里主要说明另一种方式，也就是通过AbstractProcessor在Java编译时生成代码的方式实现注解处理器。



AbstractProcessor介绍

AbstractProcessor，...]]></description><category></category></item><item><title><![CDATA[Java 注解及自定义注解处理器]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/79622715</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/79622715</guid><author>kaifa1321</author><pubDate>Tue, 20 Mar 2018 11:08:49 +0800</pubDate><description><![CDATA[注解介绍

注解，也被称为元数据（所谓的元数据，就是描述数据的数据）。 
所以注解的主要作用就是给指定代码一些描述信息。这些指定代码可以是一个类、一个方法或者是一个属性。

Java注解是在Java SE5中被引入进来的，在Java中内置了三种注解以及四种元注解。



内置注解




  内置注解
  说明



  @Override
  表示当前的方法定义将覆盖超类中的方法，如果方法名或者...]]></description><category></category></item><item><title><![CDATA[Git常用命令]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/72453165</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/72453165</guid><author>kaifa1321</author><pubDate>Wed, 17 May 2017 21:30:05 +0800</pubDate><description><![CDATA[git命令大全：git init [newreponame] 
    创建一个本地仓库。 
    newreponame ：指定新仓库的名称git add [.] [file …] 
    将文件添加到暂存区。 
    . :添加所有文件；file … :添加指定文件git status [-s] 
    查看文件是否修改（文件状态有三种：未跟踪、未暂存、未提交）。 
    -s ：显示]]></description><category></category></item><item><title><![CDATA[数据结构 二叉搜索树]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/70948030</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/70948030</guid><author>kaifa1321</author><pubDate>Sat, 29 Apr 2017 13:15:15 +0800</pubDate><description><![CDATA[概述二叉搜索树，也成为二叉查找树或者二叉排序树，这是一种特殊的二叉树。在二叉搜索树中的数据结构中，我们可以通过链表来表示。对该树种的节点，需要定义关键字data，父节点parent，左孩子节点leftChild，右孩子节点rightChild。在二叉搜索树中，对任何节点node，其左子树中的所有节点的data的最大值不会超过node.data，其右子树的所有节点的data不会小于node.data。]]></description><category></category></item><item><title><![CDATA[数据结构 二叉树及遍历二叉树]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/70666265</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/70666265</guid><author>kaifa1321</author><pubDate>Mon, 24 Apr 2017 22:21:45 +0800</pubDate><description><![CDATA[概述二叉树，是每个节点最多有两个子树的树结构。通常子树被称作“左子树”（left subtree）和“右子树”（right subtree）。二叉树的特性
在非空二叉树中，第i层的结点总数不超过  , i>=1；
深度为h的二叉树最多有  个结点(h>=1)，最少有h个结点；
对于任意一棵二叉树，如果其叶结点数为N0，而度数为2的结点总数为N2，则N0=N2+1；
具有n个结点的完全二叉树的深度为]]></description><category></category></item><item><title><![CDATA[数据结构 树及树的存储结构]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/70596645</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/70596645</guid><author>kaifa1321</author><pubDate>Mon, 24 Apr 2017 21:47:25 +0800</pubDate><description><![CDATA[概述树，它是由n（n>=0）个有限节点组成一个具有层次关系的集合。当n=0时，这棵树被称之为空树。树它具有以下的特点：
每个节点有零个或多个子节点；
没有父节点的节点称为根节点；
每一个非根节点有且只有一个父节点；
除了根节点外，每个子节点可以分为多个不相交的子树；
树的相关属性结点的度
结点拥有的子树数称为结点的度。
度为0的结点称为叶子结点或终端结点，度不为0的结点称为非终端结点或分支结点。
除]]></description><category></category></item><item><title><![CDATA[数据结构 链表]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/70557503</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/70557503</guid><author>kaifa1321</author><pubDate>Sun, 23 Apr 2017 23:38:45 +0800</pubDate><description><![CDATA[概述在讲链表的数据结构之前，我们先说一个最简单的数据结构-线性表。对于线性表，想必作为开发者都不会陌生，我们常用的数组就是通过线性表实现的，线性表就是在内存中一段连续的内存地址。与线性表相比，链表的数据结构也是按照每个元素的线性顺序排列的，但是与线性表不同的是，链表的顺序是通过每个元素中指针决定的。双链表双向链表也叫双链表，是链表的一种，它的每个数据节点中都有两个指针，分别指向前驱结点和后继结点：p]]></description><category></category></item><item><title><![CDATA[数据结构 栈和队列]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/70502563</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/70502563</guid><author>kaifa1321</author><pubDate>Sun, 23 Apr 2017 15:33:46 +0800</pubDate><description><![CDATA[概述栈和队列都是通过动态集合来存储数据，在栈和队列中添加和删除数据都是预先设定的，在栈（Stack）中，被删除的元素是最近添加的元素，所以栈的实现方式是后进先出（Last-in， First-out）；在队列中，被删除的元素是最开始添加的的元素，也就是在动态集合中存放时间最长的那个元素，所以队列的实现方式是先进先出（First-in，First-out）。栈在栈的数据结构中，添加元素的操作被称之为入]]></description><category></category></item><item><title><![CDATA[Java List集合比较]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/62427592</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/62427592</guid><author>kaifa1321</author><pubDate>Mon, 20 Mar 2017 14:51:49 +0800</pubDate><description><![CDATA[概述

Java集合类位于java.util包下，主要包含Collection和Map两大类，在该包下还包含一些常用的集合工具类如Collections等。这里我们可以看一下java下集合框架的整体继承关系图，如下 


其中，Queue（队列）是在Java SE1.5中引入的新的集合类，除此之外在Java SE1.5中还引入了一些用于多线程并发的集合框架，这个在这里不做介绍。

今天，我们主要介]]></description><category></category></item><item><title><![CDATA[Android Activity的UI绘制流程之setContentView方法详解]]></title><link>https://blog.youkuaiyun.com/kaifa1321/article/details/53455525</link><guid>https://blog.youkuaiyun.com/kaifa1321/article/details/53455525</guid><author>kaifa1321</author><pubDate>Sun, 04 Dec 2016 18:06:53 +0800</pubDate><description><![CDATA[概述对于Android开发人员来说，想必对setContentView方法不会陌生，每当我们创建一个Activity时，都会重写该Activity的onCreate方法，在该方法中我们必须要调用setContentView方法来显示我们指定的布局或者View。那么setContentView方法又是如何将我们指定的布局或者View放入到指定的Activity中显示出来的呢？今天这篇博客主要就是讲解A]]></description><category></category></item></channel></rss>