自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 EasySocket一款轻量级的Android端Socket框架

源码地址:https://github.com/jiusetian/EasySocketEasySocket的初衷是希望使Socket编程变得更加简单、快捷,因此项目在实现了Socket基本功能的基础上,还实现了TCP层面的请求回调功能。传统的Socket框架客户端发出一个请求信息,然后服务器返回一个应答信息,但是我们无法识别这个应答信息是对应哪个请求的,而EasySocket实现了将每个请求...

2019-06-12 19:46:26 27523 83

原创 FFmpeg播放器-音视频同步原理

一、为什么要音视频同步在播放器的开发中,音频和视频都是在各自独立的线程中解码播放的,理论上如果按照各自的帧率进行播放音视频的话是可以同步的,但实际由于受各种因素的影响,音频和视频会慢慢出现不同步的状况,所以解决音视频的同步非常重要二、音视频同步的方式音视频的不同方法一般有三种方式可以选择,如下:1.参考一个外部时钟,将音频与视频同步至此时间2.以视频为基准,音频去同步视频...

2020-03-10 09:48:31 1238 1

原创 Android Gradle学习系列(二)自定义Gradle插件

Gradle是一个构建工具,既然是一个构建工具,那么在构建项目的过程自然就有它执行的生命周期,Gradle插件就是在构建过程中可以执行的自定义逻辑,我们可以在Gradle构建过程中插入自己想要的代码逻辑实现指定的功能。在Android项目的gradle文件中常见的 :apply plugin: 'com.android.application',其实就是引入一个插件,这是Google为我们开发An...

2020-02-25 03:31:38 330

原创 Android Gradle学习系列(一)构建体BuildVariant

以前刚接触Gradle的时候,对很多基础概念不熟悉,对Gradle的API也不熟悉,导致总有种似懂非懂的感觉,总有种神秘的感觉,其实Gradle就是一个项目构建的框架,我们平时接触最多的就是Gradle的Groovy脚本文件。后来慢慢发现,其实Gradle有很多重要的作用,不单单是我们平时接触的Gradle脚本文件,还有比如Gradle自定义插件、Gradle中的Transfrom等等Grad...

2020-02-24 19:32:38 565

原创 关于HashMap中的hash算法

一、关于Hash表和Hash函数Hash表也称散列表,直译为哈希表,hash表是一种根据关键字值(key-value)而直接进行访问的数据结构。在哈希表的键值对关系中,key到value中间还存在着一个映射值,这个映射值就是数组的下标index,key正是通过映射到数组对应的下标index而访问到value值的,但key又是如何映射到数组下标的呢?这就要通过一个映射函数f(key),这个函数我...

2019-12-21 03:49:57 6060

转载 Android开发规范文档

前言一份合格的代码不应只满足于实现功能, 更应该遵循良好的规范. 遵循良好的代码规范有利于: 提升程序稳定性, 减少代码隐患, 降低故障率; 增强可扩展性, 大幅提高维护效率; 统一标准, 提升多人协作效率; 方便新人快速上手, 在项目组人员发生变动时保证项目进度; 这里梳理一下Android开发过程中需要注意的一些地方, 包括多个部分, 另外根据约束力...

2019-10-19 13:31:27 172

原创 Android NDK开发崩溃signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解决方法

一.前言在NDK开发的过程中,如果遇到应用Crash的情况,JNI层的报错信息并不像java层那样可以直接看到错误信息和错误的位置,如果要想定位的到错误的位置,需要借助NDK的一些工具进行地址转换,本文中用addr2line(NDK的工具)来捕捉错误信息二.分析 以下是我的报错信息读取其中的关键信息1.错误代号:signal 11 (SIGSEGV), cod...

2019-10-10 15:51:36 45815 10

原创 百度地图打包成的aar文件使用MapView报错

项目中用到百度地图的开发,然后想把地图相关的代码上传到maven当做库来使用,但是引用库文件的模块中使用百度地图MapView控件的时候, 报如下错:Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class com.baidu.mapapi.map.MapView百思...

2019-05-28 17:31:14 843 2

原创 Android性能优化(二) 内存优化

Android系统一般会限制一个App进程的内存使用大小,当内存使用超过这个大小的时候,就会发生内存溢出,造成App卡顿、崩溃。内存使用不当的因素有很多,比如常见的内存泄露、内存抖动、Bitmap的使用问题(使用第三方框架可以避免)等等一:内存泄露在Android系统中,虚拟机有垃圾自动回收机制,不定期地对无用的对象进行回收清理,回收一个对象的主要依据是当前对象有没有被强引用,如果一个本该...

2019-01-28 15:49:57 564

原创 Android性能优化(一)App启动时间的优化

一:App启动方式1、冷启动:当启动应用时,后台没有该应用的进程,系统要重新创建一个新的进程分配给该应用,这种启动方式就是冷启动。冷启动首先会为应用创建一个新进程,然后创建并初始化Application和Activity,最后将界面显示出来2、热启动:当启动应用时,后台已经存在该应用的进程(比如:按Home键、Back键的时候,应用虽然退出了前台,但后台依然保存着应用的进程),这种情况下,...

2019-01-22 18:12:21 1659

原创 Android系统的启动过程

Android系统是基于Linux内核的,所以当手机启动的时候,首先是Linux内核的启动,而Linux为Android系统启动的第一个进程是init进程一、init进程init是Linux系统启动的第一个用户进程, 它的进程号是1init进程的入口函数是main,它主要做了这些工作:1)解析配置文件,主要是系统配置文件和硬件平台相关的配置文件,同时也会解析service 其...

2019-01-20 01:57:51 628

原创 RxJava 2.x 源码分析(三) 变换操作符map和flatMap

RxJava的操作符有很多,一般常用的有变换操作符,其中最主要是map和flatMap,本文将分别来讲解一下它们的实现原理。在上一篇文章:RxJava 2.x 源码分析(二) 线程切换原理中,讲到RxJava框架的执行流程,理解这个对我们源码的阅读是有很大帮助的,所以如果你还不懂的话,请移步到上一篇文章去读一下一:map的实现原理老规矩,先上一个例子: Observable.c...

2019-01-15 15:51:53 295

原创 RxJava 2.x 源码分析(二) 线程切换原理

在RxJava的使用过程中,通常会用subscribeOn来指定可观察者Observable的线程,用observerOn来指定观察者Observer的线程。本文将分析RxJava2.x的线程切换原理先来看一个例子Observable.create(new ObservableOnSubscribe<Integer>() { @Override ...

2019-01-14 18:48:39 591

原创 RxJava 2.x 源码分析(一) 分发订阅流程

本文将讲解两个知识点1.RxJava的数据分发和接收流程,即Observable(可观察者)如何分发数据和Observer(观察者)如何订阅数据2.RxJava是如何通过Disposable来取消订阅的,让Observer中断接收Observable分发的数据一:RxJava2.x的数据分发和接收通过一个简单的例子来看看RxJava的使用 //1.为了方便理解...

2019-01-14 12:35:19 447

原创 Android自定义View(五)Matrix应用详解

上次我们讲到了Matrix的原理,知道了Matrix内部其实就是通过矩阵计算去映射坐标变化的,还有矩阵前乘和后乘的区别等等这篇文章主要讲解Matrix相关方法的使用,先来看一下matrix主要有哪些方法,如下表:方法类别 相关API 摘要 数值操作 set reset setValues getValues 设置、 重置、 设置数值、 获取数值 数值计...

2019-01-10 23:20:27 1010

原创 Android自定义View(四)Path之贝塞尔曲线

一、概述1、贝赛尔曲线来源在数学的数值分析领域中,贝赛尔曲线(Bézier曲线)是电脑图形学中相当重要的参数曲线。更高维度的广泛化贝塞尔曲线就称作贝塞尔曲面,其中贝塞尔三角是一种特殊的实例贝塞尔曲线于1962年,由法国工程师皮埃尔·贝塞尔(Pierre Bézier)广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de ...

2019-01-09 17:33:05 4006 1

原创 Retrofit 2.0源码解读

Retrofit是基于OKhttp实现的网络请求框架,是对OKhttp的优秀封装,使用起来更加方便、简洁,特别还提供了RxJava的支持。Retrofit框架中采用了大量的设计模式来实现超级解耦,所以本文的初衷希望通过Retrofit源码的解读,来学习一下作者优秀的设计思想一个Retrofit网络请求,一般会经历如下步骤:1.创建Retrofit实例对象,配置请求相关参数,比如URL、请求...

2018-12-20 17:45:32 239

原创 OKHttp 3.10源码解析(四):连接机制

OKhttp的底层用的是Socket连接而不是URLConnection,所以整体来说还是比较复杂的,涉及到Http协议的封装和解封装、TLS/SSL安全协议的封装、Http2的封装等等,但还是非常值得我们去学习一下的,本篇文章不会对这些底层原理有详细的解析,但读完之后至少大概知道在网络请求中这些底层是如何实现的一.HTTP请求的优化1.keep-alive机制我们知道,一个HTTP的...

2018-12-14 22:55:03 1112

原创 OKHttp 3.10源码解析(三):缓存机制

本篇讲解OKhttp的缓存机制,在网络请求中能合理地利用本地缓存可以减少网络开销,提高响应速度。Http报头定义了很多有关控制缓存策略的域,因为OKhttp的缓存机制终究也是基于Http的缓存策略来实现的,所以我们先来认识一下Http的缓存策略一.HTTP缓存策略Http缓存有多种规则,根据是否需要向服务器发起请求将缓存分为两大类:强制缓存和对比缓存强制缓存是服务器会给客户端一个资源的...

2018-12-13 14:59:21 550

原创 OKHttp 3.10源码解析(二):拦截器链

本篇讲解OKhttp的拦截器链,拦截器是OKhttp最大特色之一,通过拦截器链,可以拦截到请求数据或响应数据并对它们进行相关处理,我们还可以自定义拦截器interceptor上篇文章中我们讲到,不管是OKhttp的同步请求还是异步请求,最后都会调用getResponseWithInterceptorChain来完成请求,那么本篇文章就从这个方法开始,来分析OKhttp的拦截器链策略的实现...

2018-12-12 10:32:04 440 2

原创 OKHttp 3.10源码解析(一):任务请求

OKhttp是目前Android端最热门的网络请求框架之一,它以高效的优点赢得了广大开发者的喜爱,以下是OKhttp的主要特点:1.支持HTTPS/HTTP2/WebSocket2.内部维护线程池队列,提高并发访问的效率3.内部维护连接池,支持多路复用,减少连接创建开销4.透明的GZIP处理降低了下载数据的大小5.提供拦截器链(InterceptorChain),实现reque...

2018-12-11 18:08:36 1788 2

原创 Android的Window工作机制

在Android中Window表示一个窗口,像我们日常使用的Activity就会有一个Window实例,用它来管理Activity中的视图呈现。Window其实是一个抽象类,它的具体实现类是PhoneWindow,每一个视图View的呈现都需要Window来实现,也可以说View是Window的实体存在既然Window涉及到视图View的呈现,那么里面必然会有View的绘制行为,我们知道Vie...

2018-12-03 16:25:01 494

原创 Android消息机制(Handler、MessageQueue和Looper三者的工作原理)

Android的消息机制中有三个重要的类:Handler、MessageQueue和Looper。其中MessageQueue是先进先出的消息队列,它存储一组消息,有插入和删除的功能;Looper是循环的意思,主要功能是轮询MessageQueue里面的消息,然后交由Handler处理,如果暂时没有消息,则会等待;Handler主要统筹Looper和MessageQueue的功能,实现消息的发送和...

2018-12-01 14:53:34 944

原创 深入理解Java多线程-线程池(ThreadPool)

在java多线程开发中,一般使用线程的时候都是创建一个Thread对象,然后调用start方法执行,这样做没有什么问题,但是如果有多任务并发执行的时候,你可能需要频繁地创建多个线程来执行任务,这样会造成性能方面的问题,体现如下:1.大量的线程的创建和销毁,本身就是一个很大的性能开销2.大量线程同时运作的时候,会造成资源紧张,我们知道线程的底层机制就是切分CPU的时间,在大量线程互相抢占资源...

2018-11-30 12:07:41 456 1

原创 深入理解Java多线程-synchronized的使用及其原理

线程安全是多线程编程中的一个重要的知识点,何为线程安全?在多线程并发中,有很多数据是线程共享的,当我们某个线程去操作共享数据的时候,需要先将共享数据复制到当前线程的工作内存中来,然后操作完后再将数据更新到主存空间中去。这就造成了一个问题,如果有多个线程去读取和操作某个共享数据的时候,会造成数据读取的不确定性,即我们不能确定读取的数据是其他线程操作之前还是之后的数据先来看看下面的一个例子:...

2018-11-28 21:52:20 444

原创 深入理解Java反射机制

反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象, 都能够调用它的所有属性和方法,这种动态获取类信息和动态调用对象方法的机制我们称之为Java语言的反射机制。我们知道, Class类是反射得以实现的重要部分,而对应的class对象是在JVM在的类加载过程的加载阶段自动为我们生成的,Class类与java.lang.reflect反射包类库一起支持着反射的...

2018-11-26 17:36:36 257

原创 深入理解Java注解类型

Java注解在实际应用中很广泛,目前很多主流的框架也采用了注解来提高效率,其实注解可以理解为Java代码中的一个标记,也可以理解为一个对象,它有自己的属性和值,只是没有相关方法的实现而已。下面先通过一个例子来看一下什么是注解public class Test { //添加自定义注解 @FunAnno(name="我是方法a") public void fun_a()...

2018-11-22 21:35:03 637

原创 JVM的内存管理

一:JVM内存模型图示 图1 图2上面两个图都展示了虚拟机内存管理模式,整个运行时数据区又分为不同的内存区域,不同区域承担不...

2018-11-19 16:02:03 3742

原创 Java数据结构和算法 (二) 二叉排序树

一、二叉树简介在数据结构中,对于有序数组来说查找很快,但是插入和删除慢,因为插入和删除需要先找到指定的位置,后面所有的元素都要移动一个位置,为插入腾出一个位置或补上被删除的那个位置;而对于链表来说,插入和删除快,但是查找很慢,插入和删除只要更改一下元素的引用值即可,而查找每次都要从头开始遍历直到找到目标元素为止。那么有没有一种数据结构能够同时具备查找、插入、删除都快的呢?所以有了树的诞生!...

2018-11-18 17:10:46 209

原创 Java数据结构和算法 (一) 哈希表

Hash表也称散列表,直译为哈希表,hash表是一种根据关键字值(key-value)而直接进行访问的数据结构。比如在基于数组的情况下,通过将关键字key映射到数组的某个下标来加快查找速度,这种起映射作用的函数我们称之为哈希函数每种哈希表都有自己的哈希函数,哈希函数是自己定义的,没有统一的标准,下面我们基于一个简单的哈希函数 f(key) = key%arraySize来分析一下哈希表的实现过...

2018-11-16 21:34:26 210

原创 Android属性动画的用法

Android动画的实现方式有三种:属性动画、补间动画、逐帧动画。其中属性动画是指在一定的时间间隔内,通过改变目标对象的属性值而达到动画效果,相比于其他两种动画方式,灵活性大。而补间动画,通常是局限于View对象,而且不能改变View的属性,只是通过改变视觉效果来达到动画效果,这种局限使得补间动画的效果单一,无法跟属性动画相媲美。所以说学好属性动画非常重要属性动画有两个非常重要的类:Value...

2018-11-14 14:42:56 210

原创 Android属性动画源码解析

属性动画是Android开发中常用的知识,网上大多数文章都是关于属性动画的用法,本文从源码角度去分析一下属性动画的原理属性动画有两个非常重要的类,分别是ObjectAnimator和ValueAnimator,其中前者继承了后者,前者是对后者更进一步的封装,方便开发者使用。属性动画常见的用法如下ObjectAnimator animator = ObjectAnimator.ofFloa...

2018-11-13 17:23:51 380

原创 HTTPS的数字证书验证原理

一、概述网络请求方式通常分为两种,分别是HTTP请求和HTTPS请求,其中HTTP的传输属于明文传输,在传输的过程中容易被人截取并且偷窥其中的内容,而HTTPS是一种在HTTP的基础上加了SSL/TLS层(安全套接层)的安全的超文本传输协议,其传输的内容是通过加密得到的,所以说是一种安全的传输二、加密算法说到加密算法,先来了解一下两种常用的加密方式,分别是对称加密和非对称加密:...

2018-11-08 23:08:56 27231 49

原创 Android自定义View(三) Matrix的原理解析

Matrix的中文是矩阵的意思,在Android中它起着坐标映射、变换的功能。意思就是说我们在自定义view的时候,有时需要对图表进行缩放、旋转、转移、错切等操作,就需要对图表的坐标进行一定的转换,此时就是Matrix在后台起着转换的作用。Matrix是一个3x3的矩阵,大概长成下面那样子,如图:先举个例子,为什么要用Matrix进行坐标转换,比如通过Matrix对点A围绕原点旋转30°,...

2018-11-05 03:10:00 2554

原创 Android自定义View(二)View的事件分发机制

View的事件分发机制是Android中的一个难点,也是非常重要的知识点,充分理解和掌握事件分发机制有助于我们在自定义View的过程中更好地设计和解决事件相关问题。下面我们通过源码的角度去分析一下Android是怎么处理View事件分发的假如我们从Activity这个层面开始接收事件,事件的大致传递顺序是Activity->Window->View,即先从activity的disp...

2018-11-04 16:47:48 304

原创 Android自定义View(一)View的测量

在Android中,一个View绘制出来要经过三大流程,分别是measure方法测量View的宽高,layout方法确定View的位置,draw方法最终将View绘制到屏幕上;本文主要讲解view的测量原理,即measure方法的相关源码实现流程对于View的测量行为,我们首先关注ViewGroup的相关测量知识,ViewGroup作为父容器并且子view的大小一般都离不开其父容器的的影响;V...

2018-10-23 00:37:26 452 1

原创 Recylerview网格布局分割线(控件四边也有分割线)

关于RecylerView分割线的问题,当布局形式为线性布局LinearLayoutManager的时候, 官方提供了一个定义好的分割线类DividerItemDecoration,但是当布局形式为网格布局GridLayoutManager的时候,官方没有提供其分割线的实现类,需要自己去实现;网上大多网格布局分割线的实现都是只有item中间分割,控件的四周没有分割线,所以这里我实现一个item四周...

2018-10-19 11:16:44 949

空空如也

空空如也

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

TA关注的人

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