自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(52)
  • 资源 (11)
  • 收藏
  • 关注

原创 ReentrantLock的源码分析

ReentrantLock的源码分析由于synchronized是java关键字,无法通过阅读源码深入学习实现线程安全或者阻塞的原理和过程,可以通过分析ReentrantLock如何实现线程安全和阻塞的原理,更加深入理解学习。线程状态切换线程状态分别为:NEW:创建状态:创建线程了,还没有开始调用start()方法;RUNNABLE:可执行状态:调用了start()方法或者正在被Java虚拟机执行,实际上可以分为等待执行状态和正在执行中;BLOCKED:阻塞状态:1)等待其他线程释放锁,进入同步

2021-04-25 20:36:15 223

原创 Android Binder机制浅析

Binder机制听的比较多,在实际的应用中主要是AIDL跨进程通信的实现原理,但是我们平时也很少深入的了解;但是在阅读系统源码的时候尤其是四大组件的启动流程,都和Binder息息相关,APP进程通过Binder和SystemServer进程通信调用ActivityManagerService的方法,经过层层调用之后,SystemServer进程ActivityManagerService的方法又通...

2019-03-20 15:55:48 452

原创 Broadcast流程源码分析

Broadcast是观察者模式(发布订阅者模式)的应用,用于进程间通信或者进程内通信,如果仅是用在进程内通信则可以选择LocalBroadcastManager更加高效,安全;在阅读该文章前,最好先阅读,EventBus也是观察者模式(发布订阅者模式)的应用,用于进程间通信;四大组件的启动流程,相比来说Service的启动流程相对比较简单些,Broadcast和Activity相对比较复杂;...

2019-03-17 16:47:21 397

原创 startService流程

开启Service进程的主要类android.content包的ContextWrapper类android.content包的Context类android.app包的ContextImpl类android.app包的ActivityManager类android.os包的ServiceManager类android.os包的ServiceManagerNative类android...

2019-03-06 15:00:05 440

原创 线程池工作原理

前言线程池大家都听说过或者使用过,以Android-26来分析,线程池的工作原理:线程池在创建之后,线程池内没有一个线程,在添加任务之后;只有在运行的线程数小于核心线程数时,创建核心线程,执行任务;当达到最大核心线程数,但是队列未满的情况,则往队列中添加,等待有空闲的核心线程之后,从队列中取出任务执行;当队列也满了之后,并且在运行的线程未达到最大线程数,再创建普通线程(在任务完成一段时...

2019-02-25 11:46:52 3821

原创 Retrofit源码分析

Retrofit是对OkHttp进一步封装,底层依然是OkHttp进行网络请求;通过注解的方式,设置参数;里面用到的设计模式:动态代理设计模式、Builder设计模式、工厂设计模式、适配器设计模式、单例模式等,非常值得我们学习和研究。最好首先了解深入理解Java注解类型(@Annotation)和OkHttp3源码分析;Retrofit的构建Retrofit 的构建;private Str...

2019-01-18 16:38:49 153

原创 OkHttp3源码分析

OkHttp是我们日常开发过程中最常用的第三方库;用来发送网络请求,并读取相应返回数据;简单的步骤 private final OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) //5秒钟 .callTimeout(5, Ti...

2019-01-10 20:49:02 164

原创 Resources 资源加载及引入外部资源

Resources 资源加载加载res中的资源,都是通过getResources()获取的,但是Resources是在什么时候被创建的呢,如何通过Resources获取到对应的资源的呢?XmlResourceParser layout = getResources().getLayout(R.layout.activity_change_skin);int color = getResour...

2019-04-07 22:13:15 8659

原创 APP进程和SystemServer进程通信

SystemServer进程是由Zygote进程孵化的第一个进程,大部分Android提供的服务都在该进程中,SystemServer中运行的进程公共有六十多种,主要包括:ActivityManagerService(AMS),WindowManagerService(WMS),PackagManagerService(PMS)等;这些系统服务都是以一个线程的方式存在Systemserver进程中...

2019-03-22 14:58:07 1038

原创 进制和位运算

在学习系统源码的过程中,总是会遇到很多进制和位运算,尤其是位运算,特意整理一下资料以备参考。进制二进制:只有0和1;如:0001 0101;不同数据类型的十进制转换为二进制的位数不同一个字节(byte)是8位;int类型是4个字节,32位; shor类型是2个字节,16位;long类型是8个字节,64位;float类型是4个字节,32位;double类型是8个字节,64位;int...

2019-02-25 11:33:17 1057

原创 EventBus源码解析

上一篇文章ButterKnife源码分析EventBus适用于Android和Java的事件总线,简化了活动,碎片,线程,服务等之间的通信。减少代码,提高质量。EventBus主要用了观察者模式(也叫发布订阅者模式)实现代码之间的解耦。EventBus中提供异步的方式解决一个被观察者,多个被观察者,执行效率慢的问题。EventBus的使用步骤和主要变量使用的三步骤//1 定义消息事件pu...

2018-12-13 16:15:07 195

原创 ButterKnife源码分析

ButterKnife是一个专注于Android系统的View注入框架,之前只是简单的使用,知道其用注解的方式帮助减少我们findViewById(),同时在编译期自动生成XXXX_ViewBinding类帮组我们实现findViewById()和绑定回调方法的操作;但是具体的实现细节并不清楚,如何生成的XXXX_ViewBinding类的呢?本篇文章主要分为以下几个步骤注解相关知识;自动...

2018-12-11 15:57:22 364

转载 UML类图与类的关系详解

转载UML类图与类的关系详解最近开始看《设计模式之禅》(第二版)–秦小波(pdf 文档也是从网上找的,确实不错,很清晰)的书,对UML类图的语法不熟悉,特意学习了下,为了更方便的查询、理解UML语法特意转载了这篇文章,如有冒犯,请原谅,谢谢!先了解UML的语法;UML的类图在画类图的时候,理清类和类之间的关系是重点。类的关系有泛化(Generalization)、实现(Realizat...

2018-12-07 11:46:25 609

原创 RecyclerView源码分析

前言RecyclerView是一个Android5.0推出的比ListView更强大的列表控件;可以实现更复杂的效果,同时它的解耦性也更好,分析起来比LIstView更复杂;View的绘制过程View的事件传递及分发ListView的源码分析先来看下RecyclerView中的内部类;主要有LayoutManager、Recycler(类似ListView的RecycleBin)、Vie...

2018-11-30 18:44:00 343

原创 ListView源码分析

简介在Android开发中,ListView是最常用的View之一,用来展示大量的数据;但是大多数情况下,只是机械式地不断重复地使用,并没有注意内部原理,不太清楚其内部的原理是多么的巧妙,Item如何不断的复用,我们在实际工作中如何参考这种方式,去设计符合我们需要的自定义View。在此我们开始学习ListView的内部设计原理。ListView的继承关系先来看下AdapterView类是抽...

2018-11-22 17:15:54 178

原创 CoordinatorLayout的源码分析

CoordinatorLayout的使用CoordinatorLayout:是加强版的FrameLayout;主要用在以下两个实例:1)作为根布局;2)作为多个子View特殊交互的容器;CoordinatorLayout配合AppBarLayout+可滑动View(NestedScrollView,RecyclerView)使用;AppBarLayout:是一个竖直的线性布局,实现了me...

2018-11-20 09:53:24 263

原创 View事件分发及传递实践--自定义侧滑删除控件

前言侧滑删除控件常用于ListView或者RecyclerView中,侧滑删除当前条目;很早就有自定义侧滑删除控件了,只是之前直接拿来别人的直接来使用,没有太注意其中的具体的实现细节;通过深入理解View事件分发及传递之后,自己动手加深相关理解View的事件传递及分发机制,特意自己来实现相关的细节;知识准备:View的scrollBy()、scrollTo()方法:scrollBy() ...

2018-11-14 15:05:38 170

原创 View的事件传递及分发机制

前言当我们点击一个View,点击的动作是怎么传递到当前View的,系统会做哪些处理呢?我们在处理滑动冲突的时候,从哪里下手,毫无头绪;我们先来看下事件的传递及分发机制,系统是如何传递事件,分发事件的,给我们处理相关问题提供基础知识。先了解下Activity的层级结构,便于更好的理解事件的传递顺序;要点总结:触摸事件有一个down,多个move,一个up组成;事件的传递是从Act...

2018-11-06 10:15:49 6870 3

原创 View的绘制过程

前言在实际的开发过程中,类似TextView的setText()之后,View就会展示我们赋值的内容,但是在类似setText()操作之后,系统做了哪些操作来实现最终的结果的呢?我们现在来看一下。1:调用requestLayout() —View类requestLayout() —ViewRootImpl类requestLayout()—scheduleTraversals()—doTrave...

2018-10-31 18:14:06 216

原创 单链表的具体实现

前言链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接顺序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比线性表顺序表快得多,但是查找...

2018-10-26 18:15:50 179

原创 Fresco点击默认图 无法响应点击事件

由于之前没有过fresco框架,最近发现项目中SimpleDraweeView加载url没有加载出图片显示默认图,点击无法响应点击事件;但是快速多点击几次又可以响应点击事件;这种现象十分奇怪?以下是加载方法;public static void loadImageView(String url, SimpleDraweeView view, int defaultResource) { ...

2018-10-26 15:33:53 460

原创 Shape-渐变色及只显示单边框

渐变色一般情况下,View的背景色都是比较单一的;但是在特殊的需要的时候,需要渐变色背景,就无法实现了;用一下代码就可以实现了;<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android&qu

2018-10-26 15:30:50 710

原创 查找二叉树的实现

简介不了解相关概念可先阅读 数据结构-树定义及分类树集合了数组(查找速度快)和链表(插入、删除速度快)的优点;二叉搜索树的效率:树的大部分操作需要从上至下一层层的查找树的节点,对于一棵满树,大约有一半的节点处于最底层(最底层节点数 = 其它层节点数的和 + 1),故节点操作大约有一半需要找到最底层节点,大约有四分之一的节点处于倒数第二层,故节点操作大约有四分之一需要找到倒数第二层节点,依此...

2018-10-22 16:52:16 336

原创 数据结构-树定义及分类

简介树状图是一种数据结构,它是由n(n>=1)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:每个节点有零个或多个子节点;没有父节点的节点称为根节点;每一个非根节点有且只有一个父节点;除了根节点外,每个子节点可以分为多个不相交的子树;定义树(tree)是包含n(n>0)个结点的有穷集...

2018-10-22 16:11:38 1499

原创 ArrayMap的源码分析

简介ArrayMap是一个<key,value>映射的数据结构,它设计上更多的是考虑内存的优化,内部是使用两个数组进行数据存储,一个数组记录key的hash值,另外一个数组记录Value值;在数据量不大的情况下,用来代替HashMap;int[] mHashes;是key的hash值的数组;Object[] mArray;是key,value数组,这两个值的下标和mHashes的...

2018-10-22 15:38:20 235

原创 深入理解Handler消息机制

简介Handler主要用于是线程之间转换;通过其他线程发送消息,在目标线程消费消息,做到线程之间的切换;消息机制主要组成部分:Handler:发送和接受消息(Message);MessageQueue:消息队列,将Handler发送的消息存在队列中(实际是单链表);Looper:死循环,不断的从MessageQueue中取出要执行的消息,执行Handler的dispatchMessage...

2018-09-23 14:55:04 200

原创 LinkedBlockingQueue源码分析

简介LinkedBlockingQueue以链表(单链表)为基础实现的队列,先进先出,head是队列中存在最久的元素,tail是最新加入的元素,添加元素从队尾添加;删除元素,从队头删除;不容许插入null;线程安全,用ReentrantLock实现线程安全;用法和ArrayBlockingQueue一致AtomicInteger类AtomicInteger,一个提供原子操作的Intege...

2018-09-21 21:14:17 174

原创 ArrayBlockingQueue源码分析

简介队列(Queue)的实现方式主要有两种,一种是以数组来实现的;另一种是以链表的来实现的。ArrayBlockingQueue是以固定长度的数组实现的,先进先出;head是队列中存在最久的元素,tail是最新加入的元素,添加元素从队尾添加;删除元素,从队头删除;不容许插入null;线程安全,用ReentrantLock实现线程安全;final Object[] items:元素数组;...

2018-09-21 21:07:18 137

原创 LinkedHashMap及其应用LruCache

LinkedHashMap简介LinkedHashMap是HashMap的子类;在HashMap的基础上又用双向链表来实现的;换句话说:LinkedHashMap的所有元素不仅满足HashMap的数据结构,同时满足LinkedList的结构,维护着这两套实现方式;LinkedHashMap类主要是维护双向链表,其他的工作主要还是在HashMap中实现;LinkedHashMap...

2018-08-31 18:20:14 437

原创 HashMap源码分析

简介HashMap的key,value都可以为null;是由数组+链表实现的;无序的,线程不安全;HashMap对于手机端而言,对内存的占用比较大;某些情况下,可以用ArrayMap,SparseMap替代;插入操作put(),putAll()put()方法 key是唯一的,同一个key只能存在一个,再次put()会改变原来的值; public V put(K key, ...

2018-08-31 18:10:06 188

原创 LinkedList源码分析

简介双向链表,线程不安全,在内存中不连续存储,不仅实现了List接口,也实现了Deque接口;transient Node first;头结点 transient Node last;尾节点插入操作:add(E e):在链表尾节点后插入新的节点,作为尾结点;public boolean add(E e) { linkLast(e); return true...

2018-08-31 18:04:14 108

原创 ArrayList及同类比较

介绍特性:元素可重复,容许null,查询效率高,插入和删除效率低,线程不安全; 主要用到下面两个方法: Arrays.copyOf(T[] original, int newLength);根据newLength创建了一个新的数组,然后调用System.arraycopy()将原数组original内容复制到新数组中,并且将新数组返回; System.arraycopy...

2018-08-31 17:50:28 721

原创 性能优化-Java垃圾回收机制

前言Android开发中经常会遇见应用内存不断增加,或者在处理不当的情况下,造成内存泄漏,严重会导致OOM;但是Java有自动垃圾回收机制,为什么还会造成这种情况呢,那我们通过new关键字创建出来的对象、开启的Activity在什么情况下会被回收呢?带着这个问题,我们先来了解下,Java的垃圾回收机制。 Java虚拟机内存区域通过##Zygote进程浅析##我们知道所有的Andr...

2018-05-18 11:31:11 1354

原创 Activity启动流程浅析(Anroid-26)

前言Activity是Android的四大组件之一,也是我们最常用的组件,我们一般通过startActivity()或者startActivityForResult()方法开启一个新的Activity,但是具体如何启动一个新的Activity,我们对此毫无概念,不知道其内在的实现原理和流程,现在我们来根据Anroid-26源码具体了解下Activity的整个启动流程。在阅读之前可先了解下:...

2018-05-10 15:16:36 269

原创 SystemServer进程浅析

前言从上一篇文章Zygote进程浅析我们知道Zygote是孵化器,所有其他Dalvik虚拟机进程都是通过zygote孵化(fock)出来的;所以SystemServer进程是由Zygote进程fock(孵化)出来的,详见XXX。SystemServer进程是Android系统的核心之一,大部分Android提供的服务都在该进程中,SystemServer中运行的进程公共有六十多种,主要包括:A...

2018-05-02 19:09:31 5774

原创 Zygote进程浅析

简介zygote是受精卵的意思,它是Android中的一个非常重要的守护进程服务(Daem Service),所有的其他Dalvik虚拟机进程都是通过zygote孵化(fork)出来的。Android应用程序是由Java语言编写的,运行在各自独立的Dalvik虚拟机中。如果每个应用程序在启动之时都需要单独运行和初始化一个虚拟机,会大大降低系统性能,因此Android首先创建一个zygote虚拟...

2018-04-20 19:35:01 6058

原创 Activity的启动模式和任务栈

简介上一篇文章详细介绍了Activity生命周期详解及注意事项。根据上一篇文章我们知道,当Activity A开启一个Activity B之后,系统会创建一个Activity B实例,推入到任务栈中,并且位于栈顶,位于Activity A的实例之上;当点击back键之后,Activity B从任务栈中被弹出即Activity B被销毁;Activity A重新可见,再次回到栈顶。任务...

2018-04-03 18:37:45 447

原创 Activity生命周期详解及注意事项

简介Activity是Android app的重要组成部分,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。一个应用通常由多个彼此松散联系的Activity组成。一般会指定应用中的某个Activity为“主”Activity,即首...

2018-03-27 18:32:21 536

原创 RxJava2.0-Flowable类

简介RxJava2.0提供了5中操作符的基类,分别为Observable,Flowable,Single,Completable,Maybe;前面几篇文章都是以Observable介绍相关的操作符,Observable是非背压,可选的多值基类,提供工厂方法,操作符和处理同步或者异步数据流的能力;Observable的操作符默认提供缓存空间大小128,但是大多数操作符实现类允许显示的设置缓存区大...

2018-02-09 12:16:37 4834

原创 RxJava2.0- Schedulers线程切换原理分析

简介RxJava的核心是异步;Schedulers实现发射和接收事件在两种不同的线程中去执行相应的操作;  调度器(Schedulers )是RxJava中最重要的一部分,随意的切换调用线程;Schedulers在RxJava中主要有一下几种方式:SingleScheduler:共享的,单一线程的调度器;内部有一个核心线程数为1,最大线程数为Integer.MAX的线程池;Comp...

2018-02-01 16:36:08 898

[C++入门经典(第3版).pdf

本书主要介绍标准的C++编程语言,涉及C++的语法,面向对象的功能和标准库等所有基本内容,阅读本书将获得编写C++应用程序的所有必要知识

2019-07-25

一键换肤,反射工具类

一键换肤主要代码,反射工具类,内部有福利

2019-04-07

侧滑删除源码

侧滑删除:适用于普通View,ListView,RecyclerView; 解耦性强,只需要引用SideSlipDeleteView作为条目的根View或者一部分即可;在Adapter设置监听实现只有一个Item滑出

2018-11-14

二叉查找树的具体实现-java

树集合了数组(查找速度快)和链表(插入、删除速度快)的优点; 二叉搜索树的效率: 树的大部分操作需要从上至下一层层的查找树的节点,对于一棵满树,大约有一半的节点处于最底层(最底层节点数 = 其它层节点数的和 + 1),故节点操作大约有一半需要找到最底层节点,大约有四分之一的节点处于倒数第二层,故节点操作大约有四分之一需要找到倒数第二层节点,依此类推;查找过程中,需要访问每一层的节点,故只要知道了查找的层数,就能知道操作所需的时间,如果节点总数为N,层数为L,L=log2(N+1);

2018-10-29

OpenCV3编程入门-毛星云

高清版 有详细目录 OpenCV在计算机视觉领域扮演着重要的角色,作为一个基于开源发行的跨平台计算机视觉库,OpenCV实现了图像处理和计算机视觉方面的很多算法。本书以当前最新版本的OpenCV最常用最核心的组件模块为索引,深入浅出的介绍了OpenCV2和OpenCV3中的强大功能、性能、以及新特性。

2018-05-15

Android源码设计模式解析与实战-何红辉 关爱民

高清版 带详细目录 本书专门介绍Android源代码的设计模式,共26章,主要讲解面向对象的六大原则、主流的设计模式以及MVC和MVP模式。

2018-05-11

Android线程,线程池,AsyncTask,HandlerThread和IntentService的用法

Android线程,线程池,AsyncTask,HandlerThread和IntentService的用法demo

2018-01-19

线程,线程池与Handler的用法

子线程的开启,线程池种类的介绍,线程池的应用,子线程更新Handler的用法

2018-01-16

Service的常见用法分析源码

进程内和跨进程Service的生命周期,绑定方式,Service与Activity之间的通信方式

2018-01-10

空空如也

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

TA关注的人

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