自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (1)
  • 收藏
  • 关注

原创 源码解读Binder机制四(深入解析)

在第二篇中说到了BpBinder::transact调用了IPCThreadState::self()->transact,我们看下具体实现细节,注意这里是BpBinder的transactstatus_t IPCThreadState::transact(int32_t handle, uint32_t code, ...

2020-03-30 18:39:14 650

原创 源码解读Binder机制三(Clent 端如何获取 Service实例)

上文的篇幅很长,介绍了ServiceManager的启动流程,以SurfaceFlinger为例,介绍了它的简单启动流程和如何将自身添加到ServiceManager中。这篇了解下Clent端如何获取Service。ContextThemeWrapper @Override public Object getSystemService(String name) { ...

2020-03-30 16:37:03 484 1

原创 源码解读Binder机制二(SurfaceFlinger 如何向 ServiceManager 注册)

上文用简单的AIDL实例应用程序之间的进程间通讯,它是一种c/s架构。client端:Proxy.transact()来发送事务请求;server端:Stub.onTransact()会接收到相应事务。这篇介绍Server如何通过binder向ServiceManager注册服务的?ServiceManager源码中用到binder最多的就是ServiceManager。Bin...

2020-03-30 14:18:53 636

原创 源码解读 Binder 机制一(一个简单的 AIDL 实例)

先从一个简单的AIDL看如何跨进程通讯。定义AIDL:interface IMyAidlInterface { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ String basicTypes...

2020-03-29 15:58:14 270

原创 Retrofit源码解析

Retrofit是RESTful的HTTP网络请求框架的封装。网络请求的工作本质上是OkHttp完成的,而Retrofit仅负责网络请求接口的封装。创建Retrofit实例 // 配置 Retrofit mRetrofit = new Retrofit.Builder() .baseUrl(Constant.API_YOUTU...

2020-03-28 20:17:15 209

原创 android源码中的反射、代理的应用

1、反射反射机制是 Java 语言提供的一种基础功能,通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。java.lang 或 java.lang.reflect 包下的相关抽象,就会有一个很直观的印象了。Class、Field、Method、Constructor 等,可以操作类和对象。反射提供的 A...

2020-03-28 15:17:43 403

原创 RxJava源码(衍生RxLifecycle)

Hot Observable无论有没有Subscriber订阅,事件始终都会发射。Hot Observable是共享数据的,对于Hot Observable的所有subscriber,他们会在同一时刻收到相同的数据。Cold Observable​​​​​​​只有 Subscriber订阅时,才开始发射数据流, Cold Observable与订阅者只能是一对一的关系,即当有多个不...

2020-03-26 18:38:00 221

原创 Java内存区域的划分

首先,程序计数器(PC,Program Counter Register)。为保证程序能够连续的执行下去,处理器必须具有某些手段来确定下一条指令的地址,而程序计数器正式起到着这种作用。在 JVM 规范中,每个线程都有它自己的程序计数器,并且任何时间一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会存储当前线程正在执行的 Java 方法的 JVM 指令地址;或者,如果是在执行本地(...

2020-03-26 13:38:49 140

原创 Java垃圾回收

垃圾收集机制是 Java 的招牌能力,现在写出来未免有些老生常谈了。一、垃圾标记算法引用计数算法每个对象都有一个引用计数器,当对象在某处被引用时,它的计数器就加1,引用失效减1。当计数器变为0时,该对象不能被使用。缺点是没有办法解决对象的循环引用。可达性分析(根搜索算法)将对象及其引用关系看作一个图,选定一些活动的对象作为GC Roots,并组成根对象集合,然后以这些GC ...

2020-03-26 11:27:51 162

原创 Java中引用类型

强引用我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回收具有强引用的“存活”对象来解决内存不足的问题。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应...

2020-03-26 10:25:17 101

原创 RxJava源码(衍生RxBinding)

RxJava源码(从just开始)RxJava源码(简单操作符)RxJava源码(线程)RxJava源码(背压)RxJava源码(RxBinding)

2020-03-26 09:19:24 201

原创 简单排序总结

冒泡排序原地排序算法:冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为 O(1)。稳定的排序算法:在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序。最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了,所以最好...

2020-03-25 20:31:27 182

原创 深入理解Lru缓存

基于基础结构实现LRU缓存淘汰策略1)什么是缓存?缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。2)为什么使用缓存?即缓存的特点缓存的大小是有限的,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?就需要用到缓存淘汰策略。3)什么是缓存淘汰策略?指的是当缓存被用满时清理数据的优先顺序。...

2020-03-25 19:55:35 432

原创 RxJava源码(背压)

一、简介先来看下背压方式的简单实现: // 1、创建Flowable对象 val flowable = Flowable .create<Int>(object : FlowableOnSubscribe<Int?> { override fun subscrib...

2020-03-23 18:54:37 202

原创 Java并发相关知识总结

Java并发的一些总结Java并发包也就是 java.util.concurrent 及其子包,集中了 Java 并发的各种基础工具类,具体主要包括几个方面:提供了比 synchronized 更加高级的各种同步结构,包括 CountDownLatch、CyclicBarrier、Semaphore 等,可以实现更加丰富的多线程操作,比如利用 Semaphore 作为资源控制器,限制同时进...

2020-03-23 10:28:45 166

原创 Handler源码解读(四)

IdleHandler的定义,这里返回true,表示下次空闲时还会触发。 public static interface IdleHandler { boolean queueIdle(); }它的用法 private MessageQueue.IdleHandler mIdleHandler = new MessageQueu...

2020-03-23 09:49:20 152

原创 Handler源码解读(三)

今天重点研究下Handler消息延迟Handler的sendMessageDelayed public final boolean sendMessageDelayed(Message msg, long delayMillis) { if (delayMillis < 0) { delayMillis = 0; ...

2020-03-22 17:44:51 119

原创 Handler源码解读(二)

上文介绍了Handler的创建,今天看下消息的传递机制首先发送一个消息,Handler的sendMessage和post public final boolean post(Runnable r) { return sendMessageDelayed(getPostMessage(r), 0); } public final boolea...

2020-03-22 17:07:48 240

原创 Handler源码解读(一)

Handler构造函数 public Handler() { this(null, false); } public Handler(Callback callback, boolean async) { // mLooper = Looper.myLooper(); if (mLooper == nul...

2020-03-22 15:57:24 171

原创 HashMap源码解析

一、定义散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。散列函数,它是一个函数。我们可以把它定义成 hash(key),其中 key 表示元素的键值,hash(key) 的值表示经过散列函数计算得到的散列值。开放寻址法,我们往散列表中插入数据时,如果某个数据经过散列函数散列之后,存储位置已经被占用了...

2020-03-21 17:05:08 145

原创 RxJava源码(线程)

RxJava github地址:https://github.com/ReactiveX/RxJava/tree/2.xRxJava相关概念和一些用法这里不再赘述,可以查看官方文档官方文档以及其他的一些博客,闲话少说,这里直接从rx的github中简单用法去深入源码解读。这篇分析rx的线程切换,废话不多说,直接上代码 val currentTimeMillis = Sy...

2020-03-20 17:16:59 193

原创 RxJava源码(简单操作符)

RxJava github地址:https://github.com/ReactiveX/RxJava/tree/2.xRxJava相关概念和一些用法这里不再赘述,可以查看官方文档官方文档以及其他的一些博客,闲话少说,这里直接从rx的github中简单用法去深入源码解读。上篇文章中用了个最简单的示例详细的阅读了RxJava相关源码流程。抓住几个常用操作符大致浏览下,以增进印象,不再详...

2020-03-20 14:37:35 176

原创 RxJava源码(从 just 开始)

RxJava github地址:https://github.com/ReactiveX/RxJava/tree/2.xRxJava相关概念和一些用法这里不再赘述,可以查看官方文档官方文档以及其他的一些博客,闲话少说,这里直接从rx的github中简单用法去深入源码解读。直接上代码,这里用Flowable的just操作符将String对象“Hello world”打印出来。 ...

2020-03-20 13:13:11 282

原创 ArrayList、LinkedList 源码解析

一、标准答案吧ArrayList是基于动态数组实现的,可以根据需要调整容量,扩容增加 50%。其内部元素以数组形式顺序存储的,所以非常适合随机访问的场合。除了尾部插入和删除元素,往往性能会相对较差,比如我们在中间位置插入一个元素,需要移动后续所有元素。LinkedList是双向链表结构,所以它不需要像上面两种那样调整容量。它进行节点插入、删除却要高效得多,但是随机访问性能则要比动态数组慢。...

2020-03-18 21:42:32 132

原创 从 int 和 Integer 看 java 的包装类

一、概念int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(boolean、byte 、short、char、int、float、double、long)之一。Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unbox...

2020-03-18 20:36:09 446

原创 理解String、StringBuffer、StringBuilder

一、较官方解释String 是 Java 语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。StringBuffer 是为解决...

2020-03-18 20:09:09 130

cameraDemo

android相机的应用,简单的人脸识别,简单的mvp代码封装。目前未加没有动态权限申请。

2017-10-23

空空如也

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

TA关注的人

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