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