自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

lemonGuo的大脑皮层、小脑、海马体、杏仁核.....

吾生也有涯,而知也无涯 。以有涯随无涯,殆已!

  • 博客(119)
  • 资源 (3)
  • 收藏
  • 关注

原创 浅析RxJava 1.x&2.x版本区别及原理(三):1.x 版本 Scheduler调度线程变换及subscribeOn、observeOn方法源码解析

上两篇文章都是对比分析RxJava中较基本的订阅流程与操作,即Observable、Flowable等基本元素的源码,还有map、lift操作符的源码。在对Rxjava框架有了一个坚实的基础后,此篇文章将直袭Rxjava中最闪亮的Point,也是Android猿平常在开发中经常遇到的需求 —— 线程切换,主线程中需要进行耗时操作,要求切换到子线程,子线程中需要进行UI更新,要切切换到主线程。以上切...

2018-05-06 16:44:05 719

原创 Android热修复(二):以DexClassLoader类加载原理编写demo实现类替换修复

上一篇文章简易总结了热修复实现的几大原理,并详细介绍了Android中的类加载机制及源码探索,Android的类加载机制涉及到ClassLoader、DexClassLoader 、PathClassLoader 、BaseDexClassLoader 、DexPathList、DexFile多个类之间方法互相调用,但是真正的核心实现类其实是DexPathList,它具体实现了`findClass`方法,即所谓的“类

2018-02-28 23:57:11 7522 5

原创 Android热修复(一):底层替换、类加载原理总结 及 DexClassLoader类加载机制源码探索

在早期的Android开发中,若客户端发布更新后遇到紧急bug需要及时修复,通常只能等待新版本解决再次发布,但是重新发布版本代价太大且用户下载安装成本高,若Bug未及时修复,无疑会严重影响用户体验,因此衍生了一系列技术来解决以上问题,其中一种就是Hybrid方案,即将需要经常变更的业务逻辑以H5的形式独立出来。还有一种是插件化方案。因此在Android开发近几年中,又衍生出了新的解决方案——热修复。开发者可以直接将更

2018-02-23 09:24:17 6599 2

原创 Android Dex VS Class:实例图解剖析两种格式文件结构、优劣

前段时间在了解Android代码混淆和反编译原理的时候,都涉及到了dex文件,该文件中保存着app中重要的数据信息,例如源码中使用的系统api,或者是否含有广告,更甚者通过解析AndroidManifest.xml知晓activity、service、receiver等四大组件数据信息(未混淆的情况下),而且一个程序应用的所有数据信息都存储在一个dex文件中,可见该格式文件存储信息的强大优势!说起信

2018-01-31 15:38:20 2715 2

原创 Gradle 与 Android的三生三世:是我构建了你,你必将依赖于我

Android应用的构建过程是一个复杂的过程,涉及到很多工具。首先所有的资源文件都会被编译,并且在一个R文件中引用,然后Java代码被编译,通过dex工具转换成dalvik字节码。最后这些文件都会被打包成一个APK文件,此应用被最终安装到设备之前,APK会被一个debug或者release的key文件签名。以上步骤人工操作着实繁

2017-11-20 09:45:26 2758 1

原创 WireShark抓包 图解探索网络请求过程(五层网络模型、三次握手、滑动窗口协议)

当我们在浏览器输入URL点击确认后,浏览器展示出网页信息。可你曾想过这其中的过程是怎样的?理论性较强的朋友可能知道后续DNS会解析地址,然后TCP/IP三次握手建立起连接,紧接着客户端与服务器开始传输数据。不错,大致过程确实如此,可终究“眼见为实”,此篇文章重点在于亲自实践,通过WireShark抓包来图解探索网络请求的整个过程,通过实践来更透彻的认识网络模型、三次握手、滑动窗口协议等理论知识在实际

2017-09-04 09:41:36 8833

原创 优雅设计封装基于Okhttp3的网络框架(完):原生HttpUrlConnction请求、多线程分发 及 数据转换

前5篇博文完成了此框架的一大模块—–多线程下载,而这两篇文章实现另一大模块——Http基本框架封装,在上一篇博文中完成了HttpHeader的接口定义和实现、状态码定义及response、request接口封装和实现,定义了许多接口和抽象类,在接下来编码过程中会体现出程序的扩展性重要性。在此篇博文中将添加新功能——原生请求的类库支持,你会发现在此基础上只需增加3个类即可,充分体现出了程序的扩展性。新

2017-08-03 07:57:38 3761 1

原创 Effective Android:app优化 ------ 内存管理、内存泄漏、冷启动

其实关于内存泄漏的概念开发人员并不陌生,简单来说就是该被释放的对象,由于被某些实例持有引用,导致GC无法回收,不能及时被释放。以下只是简单介绍概念,详细可研究jvm。

2017-06-12 09:17:06 1282

原创 Android:图解Activity启动流程源码(整体流程)

Intent intent = new intent(this, TestActivity.class);startActivity(intent);以上代码对于Android开发者再熟悉不过了,功能即启动 TextActivity。这是最基本的Intent使用知识,通过显示Intent来触发 Activity的启动,而Activity,四大组件中的老大,是一种展示型组件,用于向用户展示交互

2017-05-11 09:48:18 2254

原创 Android 源码详解:View的事件分发机制

1

2016-10-24 12:41:35 1018

原创 走进RecyclerView未解之迷 ------ 原理和优化

(前言暂位符号)View holder究竟是什么?ProblemView holder 和 item view 是什么关系? 一对一?一对多?多对一?View holder 解决的是什么问题?View holder 和 ListView 的 item view 的复用有什么关系?没有实现 View holder 的 getView() 的例子如下,大量的 findViewById() 方法被调用,看似不是很大的开销,但其方法的底层实现是深度优先搜索,时间复杂度是O(n)。完全可以避免

2020-05-19 00:31:56 1092

原创 Java笔记一问三不知------泛型的秘密

泛型的创建和实例化1.常见创建使用(1)创建一个泛型类public class Wrapper<T> { private T instance; public T getInstance() { return instance; } public void setInstance(T instance) { this.instance = instance; }}//Wrapper Testpublic cla

2020-05-19 00:28:24 795

原创 Gradle再回首之重点归纳

回顾Android应用的构建过程是一个复杂的过程,涉及到很多工具。首先所有的资源文件都会被编译,并且在一个R文件中引用,然后Java代码被编译,通过dex工具转换成dalvik字节码。最后这些文件都会被打包成一个APK文件,此应用被最终安装到设备之前,APK会被一个debug或者release的key文件签名。一句话定义GradleGradle是一种构建工具,其构建基于Groovy(DSL) ------ 一种基于JVM的动态语言,用于申明构建和创建任务,让依赖管理更简单。年少时第一次对Grad

2020-05-19 00:12:45 728

原创 小程序调研相关文章链接

小程序原理介绍文章大都简单谈论了一下技术实现架构,科普性偏多,可重点看下标记星星链接。此次调研除了之前已知的致力于统一端的美团MpVue、京东Taro前端框架,还了解了去哪儿的娜娜奇脚手架,基于 React 的多端小程序转译框架,主要通过实现不同的render,以支持在微信、百度、支付宝小程等hybird上运行,对于小程序的覆盖性更广,不过与Taro框架都是以react为基础编写代码。小程...

2018-10-26 22:36:44 541

原创 Weex中Scroller搭配Refresh滑动时的bug:首次触摸界面时会抖动(跳动)一大段距离

一. 确认过眼神,是不想遇见的bug 如上三张图所示:第一张是【还未刷新】的效果,即初始界面;第二张是【正常刷新】效果,白色区域随着手指下拉而显示,这里设置了margin值,小球是从navbar下来的。第三张图是【非正常跳动】效果,即初次进入界面时准备下拉刷新,但并未出现第二张的效果,而是猛然跳动一大块距离!令人费解!起初笔者天真地以为是因为对Refresh和Scro...

2018-08-05 18:43:43 2527 5

原创 Android 高级UI解密 (六) :结合Activity启动源码剖析View的诞生

1

2018-06-21 14:38:09 617

原创 Android 高级UI解密 (五) :PathMeasure截取片段 与 切线(新思路实现轨迹变换)

一. PathMeasure基础API介绍顾名思义,PathMeasure是一个用来测量Path的类,以下先来介绍API基本使用,它的方法也比较少。1. 构造方法 方法名 释义 PathMeasure() 创建一个空的PathMeasure PathMeasure(Path path, boolean forceClosed) 创建 PathMea...

2018-06-11 15:06:50 3740 2

原创 Android 高级UI解密 (四) :花式玩转贝塞尔曲线(波浪、轨迹变换动画)

一. 贝塞尔初识概念 A Bézier curve (pronounced [bezje] in French) is a parametric curve frequently used in computer graphics and related fields. Generalizations of Bézier curves to higher dimensions ar...

2018-05-21 21:19:03 7128 2

原创 Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)

Canvas变换技巧(1)平移Tanslatevoid translate (float dx, float dy)API作用:用指定的转换对当前matrix 进行预处理。 参数说明: x、y轴移动的距离。注意:这里牵扯到canvas的概念,我们通常称之为“画布”,在此画布上可以绘制任何图像。此API的功能就是移动画布位置,需要强调的是每次canvas执行drawXXX的时候就会

2018-05-21 15:35:19 3200 1

原创 浅析RxJava 1.x&2.x版本区别及原理(二):map、lift操作符源码解析

上一篇文章讲解了RxJava 1.x&amp;2.x版本的基本元素(Observable、Subscriber、Flowable、Observer等)流程源码分析,对RxJava两个版本的基本使用元素和订阅原理有了一定的认识后,此篇文章将重点置于map、lift操作符,已知操作符的作用是将发出的数据进行处理再发送,RxJava源码内部具体操作原理如何?来一探究竟。此系列文章重点在于分析源码,并...

2018-05-04 17:08:21 845

原创 浅析RxJava 1.x&2.x版本使用区别及原理(一):Observable、Flowable等基本元素源码解析

RxJava开源框架的风靡程度在Github上无需多言,它带来的响应式编程模式和线程随意切换、嵌套请求、背压等功能给了开发者耳目一新的体验,更是成为了大多数APP中常用的RxJava+Okhttp/Retrofit+MVP/MVVM/Clean黄金组合中的一员。我犹记得知乎团队在去年线下还开展过一次线下RxJava交流会,邀请了扔物线讲解相关知识及体验,可见各大厂对此的重视度。如非要列举一个RxJ...

2018-05-02 23:27:55 5519 1

原创 Android内、外存储 易混淆点剖析(/mnt/sdcard、/storage/sdcard0、/storage/emulated/0等区别)

说起Android“内部存储”,对于开发者而言可以毫不犹豫地脱口而出,不就是/data/data目录嘛,也不尽然,/data/user/0/又如何解释?那说起“外部存储”,例如sd卡目录获取值,更是众说纷纭,是/mnt/sdcard?还是/storage/sdcard0?莫非是/storage/emulated/0?此疑问起源要追溯到笔者在写上一篇博文,即以DexClassLoader类加载原理编写

2018-03-07 15:11:41 34209 11

原创 Android 高级UI解密 (二) :Paint滤镜 与 颜色过滤(矩阵变换)

若是曾经查看过系统UI的源码,会发现其中使用了一些渲染效果,例如将图片加上黑白、怀旧的效果,生活中常用的逆天美颜相机,其中的原理就是使用了**滤镜效果、颜色通道过滤**。若还要深究其原理组成,便涉及到了高等数学里的矩阵变换,也就是Android 中的**颜色矩阵**!此篇文章便来一探究竟如何实现滤镜和其原理组成。(关于矩阵这一块,无需过度深究数学部分,此处为了充分理解渲染效果,只需了解大概原理,利用其API完成简

2017-12-21 10:41:06 2566

原创 Android 高级UI解密 (一) :Paint图形文字绘制 与 高级渲染

UI即User Interface(用户界面)的简称,泛指用户的操作界面,view是用户界面最基本的组件,其扩展了View类,更控制着屏幕上的绘制和实践,例如被触控。屏幕上显示的所有元素都依赖view。在自定义View或Layout时,不仅要了解测量(onMeasure)、布局(onLayout)、展示(onDraw),更要考虑处理不同的点击、滑动输入事件(onTouchEve

2017-12-18 10:50:20 3847

原创 HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)

本文以总结的形式,先大体介绍TCP/IP协议整体组成,再择其应用层上的HTTP协议进行详细总结,继而拓展知识点讲解加密学,过渡到HTTPS协议的学习,除去网络知识必备掌握的三次握手、四次挥手,另需了解基于SSL/TLS的握手,也是重要的一个环节。本文涉及到的知识点如下:网络基础TCP/IPHTTP协议基础与重点加密与签名HTTPS协议(基于SSL/TLS的握手)

2017-11-13 09:58:06 7713

原创 深入浅出之 TCP协议(三次握手与四次挥手、超时重发、流量控制、拥塞控制、与UDP区别)

TCP/IP 中有两个具有代表性的传输层协议,分别是TCP、UDP。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。要知道TCP为了这简单描述“可靠的通信传输”背后所做的努力,你会深感佩服其强大性。TCP的特征:序列化+确认应答、超时重发、流量控制、拥塞控制等等,每一个都是为了能够可靠不丢包遗漏地将数据包传输给对方,而此篇文章将详细来解析TCP的这些精髓所在,涉及的知

2017-09-14 08:43:41 6324 1

原创 谈谈有关设计模式的思想精髓:变继承关系为组合关系、如何创建对象(单例、状态、装饰者模式)

说起设计模式,最广为人知的就是“四人帮”编写的设计模式,其书的副标题为软件中可重用的元素,此书本来是一篇博士论文,它将很多通用的设计思想总结并命名成设计模式,希望开发人员之间通过专有的模式名称交流,可惜最为熟悉的是被滥用最多的Singleton单例模式,但是此书中有许多值得学习的思想。从当今角度看此书,其中一部分模式是教我们如何对现实的事物去建模,这是“设计”。而有一部分则是受到了“语言限制”

2017-09-13 08:31:44 1585

原创 Java高级知识点:并行计算(外部排序) 及 死锁分析

一. 并行计算通常单机运算时将数据放入内存中进行计算,但随着数据量的增大,最好是使用并行计算的方法。1. 算法如何设计并行排序算法?在并行计算的工作中,将每一个参与的电脑当作一个节点,节点通常是比较廉价的,可通过增加节点来提高效率。分为以下三个步骤及待解决问题:将数据拆分到每个节点上(如何拆分,禁止拆分数据依赖)每个节点并行计算得出结果(每个节点要算出什么结果?)将结果汇

2017-09-05 08:50:00 2147

原创 挖掘算法中的数据结构(七):二分搜索树(删除、广度优先遍历、顺序性)及 衍生算法问题

上篇博文介绍了二分查找算法和二分搜索树的基本操作,如插入、查找、深度优先遍历,此篇博文将要介绍二分搜索树的广度优先遍历、顺序性、局限性等相关知识,还有二分搜索树中最复杂的部分——删除节点及衍生的算法知识,涉及到的知识点如下:层序遍历(广度优先遍历)删除最大值,最小值、删除节点二分搜索树的顺序性二分搜索树的局限性树形问题和更多树。 挖掘算法中的数据结构(一):选择、插入、冒泡、希尔排序 及

2017-09-01 08:53:19 2455 3

原创 挖掘算法中的数据结构(六):二分查找 和 二分搜索树(插入、查找、深度优先遍历)

此篇文章将介绍二叉搜索树(Binary Search Tree),同上篇文章介绍的二叉堆本质上类似,都是一个二叉树。选择什么特征的二叉树是根据具体问题来决定的,需谨记选择数据结构的核心在于解决问题,并非为了使用而使用,而是因为二叉树能够高效地解决某类问题。此篇博文涉及的知识点如下:二分查找法二分搜索树基础二分搜索树的节点插入二分搜索书的查找二分搜索树的遍历(深度优先遍历) 挖掘算法中的数

2017-08-31 09:59:42 5109

原创 挖掘算法中的数据结构(五):排序算法总结 和 索引堆及优化(堆结构)

前四篇博文介绍的O(n^2)或O(n*logn)排序算法及堆排序结束,意味着有关排序算法已讲解完毕,此篇博文将对这些排序算法进行比较总结,并且学习另一个经典的堆结构,处于二叉堆优化之上的索引堆,最后拓展了解由堆衍生的一些问题。此篇涉及的知识点有:排序算法总结索引堆及其优化堆结构衍生的问题 挖掘算法中的数据结构(一):选择、插入、冒泡、希尔排序 及 O(n^2)排序算法思考 挖

2017-08-23 10:02:23 1668

原创 挖掘算法中的数据结构(四):堆排序之 二叉堆(Heapify、原地堆排序优化)

不同于前面几篇O(n^2)或O(n*logn)排序算法,此篇文章将讲解另一个排序算法——堆排序,也是此系列的第一个数据结构—–堆,需要注意的是在堆结构中排序是次要的,重要的是堆结构及衍生出来的数据结构问题,排序只是堆应用之一。此篇涉及的知识点有:堆的基本存储Shift Up和Shift Down基础堆排序和Heapify优化的堆排序 挖掘算法中的数据结构(一):选择、插入、冒泡、希尔排序

2017-08-22 14:47:35 3437

原创 挖掘算法中的数据结构(三):O(n*logn)排序算法之 快速排序(随机化、二路、三路排序) 及衍生算法

在上一篇博文中学习了时间复杂度为 O(n*logn) 的归并算法,介绍其两种实现方式——自顶向下和自底向上,不同于O(n^2)排序算法,O(n *logn)在处理百万级数据量上有明显的性能优势。而此篇文章将介绍具有代表性O(n *logn)的另一种算法——快速排序,其性能总体还会优于归并排序,但是在最坏情况下时间复杂度会退化为O(n^2)!继而出现了对快速排序的系列优化并衍生出新的实现方式,来一探究

2017-08-19 09:46:12 1736

原创 挖掘算法中的数据结构(二):O(n*logn)排序算法之 归并排序(自顶向下、自底向上) 及 算法优化

在上一篇博文中学习了时间复杂度为 O(n^2)的几个排序算法(选择、插入、冒泡、希尔排序),其中尤为需要注意的是插入排序,在近乎有序的测试用例条件下,此算法的效率会高于O(n*logn)的排序算法,所以它的效率不容小觑。但是O(n*logn)的排序算法与O(n*logn)之间还是有质变的区别,综合而言性能更优。此篇文章将讲解时间复杂度为O(n*logn)的有关算法,涉及到的知识点有:归并排序法思想

2017-08-17 14:21:21 1685

原创 挖掘算法中的数据结构(一):O(n^2)排序算法之 选择、插入、冒泡、希尔排序 及 优化

其实很多算法是依托于数据结构而存在的,包括面试中很多问题看似算法问题,本质还是数据结构,考察的远比我们想象的要基础,基础的重要性从来无需多言。例如微软曾面试过的代码实现堆、二叉树翻转等,无不是在考察基础。 语言要求对于算法而言,它其实是与语言无关的,被誉为算法神书的《算法导论》中都是以伪码的形式进行编写。

2017-08-14 15:11:28 1845

原创 优雅设计封装基于Okhttp3的网络框架(六):HttpHeader接口设计实现 及 Response、Request封装实现

到目前为止,多线程下载功能设计、编写、优化工作已经完成,但是网络框架编写工作并没有完成,此篇将完成Http核心架构,编写的新功能还是围绕在http请求上,涉及到的知识点:httpHeader的接口定义和实现http请求头和响应头访问编写http状态码定义http中的 response封装、request接口封装和实现

2017-08-02 10:31:57 3321

原创 优雅设计封装基于Okhttp3的网络框架(五):多线程、单例模式优化 及 volatile、构建者模式使用解析

关于多线程下载功能,前四篇博文所讲解内容已经实现,接下来需要对代码进行优化。开发一个新功能并不复杂,难的是考虑到代码的扩展性和解耦性,后续需要进行的bug修复、完善功能等方面。此篇内容主要讲解代码优化,将从线程优化、单例优化、设计优化这三个方面进行讲解。此篇内容将涉及到以下知识:线程优化及Linux系统中线程调度介绍Android中常用的5种单例模式解析volatile关键字底层原理及注意事项

2017-08-01 11:45:21 2124

原创 优雅设计封装基于Okhttp3的网络框架(四):多线程下载添加数据库支持(greenDao)及 进度更新

通过前三篇博文的学习,已经编码实现多线程下载功能的核心代码,通过多个线程之间的管理和调度来处理下载任务,最后再引入队列机制来完善功能。此篇博文主旨需要将下载的进度存储到数据库中,目的是为了可以在恢复时可以取出进程下载进度,从未下载部分开始下载,能更节省流量,提高用户体验。此篇文章将学习:多线程下载添加数据库支持greenDao开源库自动生成数据库相关代码完善网络请求接口中的进度更新功能

2017-07-31 14:08:43 2266

原创 JVM高级特性与实践(十四):线程安全 与 锁优化

在软件业发展初期,程序编写都是以算法为核心,程序员会把数据和过程分别作为独立部分考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维直接站在计算机的角度去抽象问题和解决问题,称为面向过程的编程思想。面向过程的编程思想极大地提升了现代软件开发的生产效率和软件可达的规模,但是现实世界与计算机世界之间存有差异,导致良好的设计原则不得不向现实做出让步。开发人员必须让程序在计算机中正确执行,

2017-07-26 13:50:31 1756

原创 JVM高级特性与实践(十三):线程实现 与 Java线程调度

衡量一个性能的高低好坏,每秒事务处理数(Transactions Per Second)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而TPS值与程序的并发能力又有密切联系。对于计算量相同的任务,程序线程并发协调得越有条不紊,效率自然越高;反之,线程之间频繁阻塞甚至死锁,将会大大降低程序并发能力。并发不一定要依赖多线程,但是在Java里面谈论并发,大多数都与线程脱不开关系。此

2017-07-25 14:59:48 3627 2

网络调试助手NetAsssist

网络调试助手NetAsssist,可以用来测试TCP、UDP收发报文。

2017-06-25

Zxing二维码扫描Demo完整源码下载

集成Zxing二维码扫描,可从相册选择图片扫描、开启闪光灯、生成二维码图片功能

2017-04-10

Zxing二维码使用Demo

Zxing二维码使用Demo

2017-04-08

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除