<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Solinzon]]></title><description><![CDATA[怕什么真理无穷，进一寸有一寸的欢喜]]></description><link>https://blog.youkuaiyun.com/xushuzhan</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xushuzhan]]></copyright><item><title><![CDATA[生产者和消费的模式的一种实现]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/79560437</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/79560437</guid><author>xushuzhan</author><pubDate>Wed, 14 Mar 2018 21:10:46 +0800</pubDate><description><![CDATA[1.概念在并发编程中，经常会提到生产者和消费者模式这一概念，这个东西往往是用来提高并发编程的效率的。所谓生产者就是产生数据的线程，所谓消费者，就是消费数据的线程。再多线程并发编程中，很有可能出现生产者的身生产速度和消费者的消费速度不一致的时候，如果不采取一定的措施，肯定是会储出现意想不到的后果的，所以，往往会用一个阻塞队列来充当一个缓冲区的作用，生产者生产的数据全部放倒阻塞队列中，消费者校消费数据的]]></description><category></category></item><item><title><![CDATA[一种横向业务的解决方案 -- AOP]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/79319515</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/79319515</guid><author>xushuzhan</author><pubDate>Mon, 12 Feb 2018 23:46:08 +0800</pubDate><description><![CDATA[AOP（Aspect Oriented Programming）即面向切片编程。所谓面向切片编程，就是可以按照时间，将程序分成无数个时间节点，利用AOP的思想，可以在任何一个时间节点插入其他的代码，来实现自己的业务需求。换句话说，对于那些非用户需求，如：性能监控、日志记录、埋点统计、动态权限、安全控制、异常处理等，可以用AOP完美地实现。 
以一个方法的执行为例子： 
 
方法的执行顺序是A-&amp;g...]]></description><category></category></item><item><title><![CDATA[Linux内核编程 -- 从HelloWord到基于NetFilter的Linux驱动Demo]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78843218</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78843218</guid><author>xushuzhan</author><pubDate>Tue, 19 Dec 2017 15:30:16 +0800</pubDate><description><![CDATA[基于Linux Ubuntu  1.安装内核头文件1.1查看Linux内核版本usname -r 
   1.2安装Linux内核头文件sudo apt-get install linux-headers-`uname -r` 
默认安装目录：/lib/modules/"内核版本号"  
2.编写HelloWord2.1 编写hello.c随便进入一个目录， 
使用：touch hello.c 新建]]></description><category></category></item><item><title><![CDATA[解锁Retrofit -- 浅析Retrofit源码]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78797240</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78797240</guid><author>xushuzhan</author><pubDate>Wed, 13 Dec 2017 21:48:40 +0800</pubDate><description><![CDATA[前言在Android的异步网络请求中，一般都会使用到一些优秀的开源库来简化网络请求与线程切换过程，Retrofit+RxJava也是时下最热门的搭配，对与Retrofit的学习，也给我带来的极大的收获，特别是了解其中的一些套路，会给自己的开发带来很大的启示。1.主线任务在具体分析之前，采用单步调试的方式先把主线拎出来，理解大致的运行过程： 
在开始分析之前，有两个需要明白的地方： 
1.Retrof]]></description><category></category></item><item><title><![CDATA[APK签名知识扫盲]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78787595</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78787595</guid><author>xushuzhan</author><pubDate>Wed, 13 Dec 2017 00:51:35 +0800</pubDate><description><![CDATA[签名的意义签名主要用于表面开发者的身份和操作权利，在签署APK时，在签署 APK 时，签署工具会将公钥证书附加到 APK。公钥证书充当“指纹”，用于将 APK 关联到开发者。主要用途是在升级应用的时候确保新版应用的来源是开发者本人，并且可以验证应用是否被第三方修改过。证书公钥证书（也称数字证书、身份证书）包含公钥以及标示密钥所有者的一些其他数据（如数字签名、签名算法、开发者姓名，居住地等）。 
在给]]></description><category></category></item><item><title><![CDATA[漂亮的Adapter模式-体会RecyclerView的设计实现]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78745993</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78745993</guid><author>xushuzhan</author><pubDate>Thu, 07 Dec 2017 21:20:16 +0800</pubDate><description><![CDATA[最近在研究设计模式的时候看到了Adapter模式，第一时间就想到了RecyclerView用到的Adapter，简单地走了一遍ReyclerView相关的源码，不得不感叹：设计得真的漂亮。 
本文算不上源码分析，只能算是理解设计模式的初级内容。1.整体把握平时使用RecyclerView的时候大只可分为三个部分： 
1.Adapter 
2.LayoutManager 
3.RcyclerView]]></description><category></category></item><item><title><![CDATA[探索MVVM -- 体会DataBinding的魅力]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78726517</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78726517</guid><author>xushuzhan</author><pubDate>Wed, 06 Dec 2017 00:46:26 +0800</pubDate><description><![CDATA[前言本文用到的demo是以“「ONE · 一个」”的API为基础，模仿其功能实践一下MVVM的用法，以感受MVVM架构为主要目的，并未完全模仿其功能，代码结构借鉴了Google的sample。 虽然谷歌今年出了一个架构组件指南，来指导开发者构建App，但对于在实际生产过程中常用到MVP和MVVM的还是不能忽略其用法，毕竟都是架构思想都是一步一步在朝着解耦化，规范化演进。以前写东西用得最多的就是MVP]]></description><category></category></item><item><title><![CDATA[基于高德SDK实现跑步时轨迹渐变功能]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78705589</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78705589</guid><author>xushuzhan</author><pubDate>Mon, 04 Dec 2017 00:01:18 +0800</pubDate><description><![CDATA[今天在无意间翻看半年多前做的项目的时候，除了对自己当时写的渣代码的无尽嫌弃，更多是感叹当时在遇到困难时的种种不易，印象比较深刻的是在做重邮约跑的时候视觉要求做一个跑步时轨迹动态渐变的功能，并且采用均匀渐变，当时翻看高德SDK时候并没有发现相应的API，所以也是一脸懵逼，只能从颜色渐变的原理入手，逐步自己写一个工具类来实现了。 
效果图如下： 
 
虽然现在来看实现起来很简单，但还是把过程记录下来吧。]]></description><category></category></item><item><title><![CDATA[简单理解类加载器]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78538394</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78538394</guid><author>xushuzhan</author><pubDate>Wed, 15 Nov 2017 10:48:16 +0800</pubDate><description><![CDATA[类加载器虚拟机设计团队把类的加载阶段中的”通过类的全限定名来获取描述此类的二进制文件“这个操作放到虚拟机外部去实现，以便让程序自己去决定去实现如何加载一个类，实现这一功能的就是“类加载器”。类与类加载器对于任意一个类，都需要由加载它的类加载器和这个类本身一同确定它在JVM中的唯一性。在比较两个类是否相等的时候，只有这两个这两个类是由同一个类加载器加载的时候才有意义，否则即使来源属于同一个Class文]]></description><category></category></item><item><title><![CDATA[简述JVM垃圾回收机制]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78522242</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78522242</guid><author>xushuzhan</author><pubDate>Mon, 13 Nov 2017 17:02:32 +0800</pubDate><description><![CDATA[1. Java中的四种引用类型在Java中，对于引用最基本的解释就是：如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址，就称这块内存代表着一个引用（有点指针的意味）。后来Java还将引用划分为了4种，根据被GC回收的时机可以分为：强引用（Strong Reference）、软引用（Soft Reference）、弱引用（Weak Reference）、虚引用（Phantor]]></description><category></category></item><item><title><![CDATA[理解Java类加载的步骤]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78494573</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78494573</guid><author>xushuzhan</author><pubDate>Thu, 09 Nov 2017 21:59:14 +0800</pubDate><description><![CDATA[前言与在编译时需要进行“连接”工作的语言不同，在Java语言里，类的加载、连接、初始化过程都是在程序运行期间完成的，这种策略虽然牺牲了一小部分性能，但是大大增加了Java的灵活性，Java里天生可以动态拓展的的语言特性就是依赖运行期动态加载和动态连接这个特点来实现的。一些热修复框架（如Tinker）、插件化框架也是运用了Java这种灵活的类加载机制来完成设计。1.类加载的时机1.一个类从加载到JVM]]></description><category></category></item><item><title><![CDATA[JVM的内存区域]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78439527</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78439527</guid><author>xushuzhan</author><pubDate>Fri, 03 Nov 2017 20:39:06 +0800</pubDate><description><![CDATA[不知不觉都大三了，回头看看以前的Android开发过程，遇到的很多问题都需要深入到源码去解决，这也促使我不断地深入学习Java的相关知识，首先要学习的肯定是JVM。不过JVM的知识体系十分庞杂，JVM的内存区域的划分是学习JVM的基础，所以就从这里开始总结。1.运行时数据区域JVM在执行Java的程序的时候会将内存划分为几个不同的区域：方法区、虚拟机栈、本地方法栈、堆和程序计数器，理解这几个区域后对]]></description><category></category></item><item><title><![CDATA[LayoutInflater#inflate()方法详解]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78430855</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78430855</guid><author>xushuzhan</author><pubDate>Fri, 03 Nov 2017 00:29:27 +0800</pubDate><description><![CDATA[1.方法原型及参数的意义public View inflate(@LayoutRes int resource, 
                        @Nullable ViewGroup root, 
                            boolean attachToRoot)  
初次接触这个方法还是在1年多以前使用RecycleView的Adapter的时候]]></description><category></category></item><item><title><![CDATA[理解HTTPS(1) -- 初识]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78418273</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78418273</guid><author>xushuzhan</author><pubDate>Wed, 01 Nov 2017 20:30:49 +0800</pubDate><description><![CDATA[前言在探究HTTPS前首先要了解这个协议的存在到底是为了什么问题，都知道HTTPS比HTTP安全，安全又体现在哪里呢？其实，HTTPS主要解决了加密密钥传输的安全问题。也就是说，对于数据的加密，还是采用对称加密，即加密和解密都是使用的一个密钥。但是这个密钥如何安全地让客户端和服务端都知道呢？这就需要引入HTTPS来保证密钥传输的安全性。 
举个例子，把A把重要的资料放在一个只能用钥匙打开的迷你保险柜]]></description><category></category></item><item><title><![CDATA[探索AIDL(2) -- 简单分析AIDL为我们自动创建的Java类]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78327929</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78327929</guid><author>xushuzhan</author><pubDate>Tue, 24 Oct 2017 11:47:22 +0800</pubDate><description><![CDATA[前言上篇文章说到AIDL只是一种接口定义语言，系统会根据它为我们自动创建进行IPC通信的代码。其实所生成的代码是一个Java类，存在于/app/build/generated/source/aidl/debug/[包名]目录下，我们可以简单分析一下到底生成了一些什么代码，这对于理解AIDL的过程很有帮助。1.自动生成的代码/*
 * This file is auto-generated.  DO]]></description><category></category></item><item><title><![CDATA[探索AIDL(1) -- 初识AIDL]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78325125</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78325125</guid><author>xushuzhan</author><pubDate>Tue, 24 Oct 2017 01:02:56 +0800</pubDate><description><![CDATA[前言1.在讨论这个问题之前必须先理解IPC的概念，IPC全称是Inner-Process Communication，即跨进程通信，是指两个进程进行数据交换的过程。 
2.如果要传递对象必须先进行序列化，序列化一个类有两种方式：一、待传递的类实现Serializable接口。二、带传递的类实现Parcelable接口，并重写相关方法。IPC的时候需要采用第二种，实现Parcelable接口。 
3.]]></description><category></category></item><item><title><![CDATA[结合Android Studio和MAT检测并简单分析内存泄露]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/78073402</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/78073402</guid><author>xushuzhan</author><pubDate>Sat, 23 Sep 2017 21:01:39 +0800</pubDate><description><![CDATA[1.什么是GC？在分析内存泄露之前首先要了解一下GC，GC（Garbage Collection）就是Java中常提到的垃圾回收，指的是JVM会自动回收不在被引用的内存数据。2.什么是GC Roots？GC Roots即Java虚拟机当前存活的对象集，其中的每一个对象可以作为一个GC Root。 
在确定一个对象是否需要被回收时，常常会用到可达性分析算法，即通过判断对象的引用链是否可达来决定对象是否]]></description><category></category></item><item><title><![CDATA[Kotlin快速入门(3) -- 其他常用新特性]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/77806360</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/77806360</guid><author>xushuzhan</author><pubDate>Sat, 02 Sep 2017 22:50:21 +0800</pubDate><description><![CDATA[1.空值检查（空安全）Kotlin 是空指针安全的，如果一个变量可能为空，必须在定义的时候显式地指定出来(在类型后面加上“?”)。 
如 var a : String ? = "666"
a = null //可以编译通过var b : String = "666"
b = null //无法编译通过，因为这里没有显式指定b可以为空
Kotlin中还有一些涉及到空安全的操作符： 
?. 如果不为空，]]></description><category></category></item><item><title><![CDATA[Kotlin快速入门(2) -- 函数]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/77510953</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/77510953</guid><author>xushuzhan</author><pubDate>Wed, 23 Aug 2017 19:56:36 +0800</pubDate><description><![CDATA[可以毫不夸张地说，在Kotlin的世界里，函数是第一公民，这些函数的特性大大简化了我们编写业务逻辑的代码量。   1.扩展函数Kotlin 也提供了一种可以在不继承父类，也不使用类似装饰器这样的设计模式的情况下对指定类进行扩展。这就是使用扩展函数： 
声明扩展函数的时候，只需要在函数名前面加上被扩展的类名即可。如，我们可以给Context类添加一个toast()的扩展函数,之后在任何继承了Conte]]></description><category></category></item><item><title><![CDATA[Kotlin快速入门(1) -- 与Java的对比学习]]></title><link>https://blog.youkuaiyun.com/xushuzhan/article/details/77478403</link><guid>https://blog.youkuaiyun.com/xushuzhan/article/details/77478403</guid><author>xushuzhan</author><pubDate>Tue, 22 Aug 2017 11:55:05 +0800</pubDate><description><![CDATA[基础语法



1.定义变量：

Kotlin中的基本数据类型和Java差不多，只是形式上每种数据的首字母都是大写的： 
Int Long Short Byte Float Double  



不可变（只读）的局部变量

Java



final int a = 1;  

kotlin  



val a = 1  



val a : Int = 1    

在Kotlin中，变量]]></description><category></category></item></channel></rss>