自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 View Touch事件分发机制

前言首先,此文章主要讲解View的Touch事件分发机制,旨在弄清楚事件分发的主要原理,因此,观其大略而不拘泥技术细节。总览 Touch事件的分发,围绕着dispatchTouchEvent() 、onInterceptTouchEvent()、onTouchEvent()做文章,弄清楚三者的触发时机,也就弄清楚了机制。dispatchTouchEvent();onInterc

2018-01-30 23:43:46 311

原创 View绘制过程原理

前言对于View的绘制原理,已有许多优秀的讲解文章。文章结构因人而异,切入角度也各不相同。此篇文章的目的在于选择一个适合自己的角度,来对自己进行检测,看自己是否真正掌握其原理。如有错误之处,欢迎指出讲解结构 文章会分别从View、ViewGroup分别梳理绘制过程,然后再进行结合,从总体上看两者如何配合进行绘制。在文章正式开始之前,先来了解一些东西测量模式 //父

2018-01-21 12:24:12 324

原创 LinkHashMap 源码解析

简介 LinkHashMap是一种基于HashMap(如果不了解HashMap, 请先了解HashMap),维护一个双向链表以保证node(即Entry)插入顺序的数据结构。而对于HashMap来说(以及它的各式的子类),node是他的粒度(也可以理解成单位、元素等),实际上的结构,就是node在其上如何摆放。LinkHashMap的node(LinkedHashMapEntry) 其构造

2018-01-13 12:50:16 540

原创 HashSet 源码解析

Set的出现,是为了维持一种元素唯一的集合。HashSet ,是在HashMap的基础之上保持这一特性,并且拥有自身的特点(如果对于HashMap忘了,或者不了解,可以先了解HashMap , 否则,是无法准确地了解HashSet的原理。所以此篇文章是基于了解一些HashMap特性的)HashSet的特点 在文章的开始,先来说说一些HashSet的特点。 1、遍历耗时与(当前容量 + 总容

2018-01-08 00:22:27 439

原创 HashMap 源码解析

HashMap 是键值对存储,且键值唯一,链表与数组混合结构的一种数据结构,因其高速查询存储效率而使用效率高,以下是其源码解析构造参数 // 默认容量 static final int DEFAULT_INITIAL_CAPACITY = 4; // 最大容量 static final int MAXIMUM_CAPACITY = 1 << 30; //默认载因

2017-12-21 11:29:06 196

原创 SimpleArrayMap 源码解析

首先,SimpleArrayMap的设计,是为了在对内存空间的使用上,要优于HashMap。因为HashMap在分配空间时是使使用空间倍增,且对空间的使用率因具体环境而定,也就是说HashMap为了保证它高速定位的特性,要牺牲很多内存空间,在Android里内存空间异常珍贵,因为,引入了SimpleArrayMap。接着,当说起SimpleArrayMap,不能不提及ArrayMap。在本质上,这两

2017-12-11 18:08:58 497

原创 EventBus源码解析

EventBus用于组件简化、解耦Activity、Fragment、Service间的通信,采用观察者模式。 下面是源码最简单的订阅EventBus.getDefault().register(this);EventBus 首先获得EventBuspublic static EventBus getDefault() { if (defaultInstance == null)

2017-11-26 10:55:05 134

原创 Retroifit源码解析

Retrofit对OkHttp3进行了封装,使更易于使用Retroifit的创建过程 首先是入口,最普通的构建 Retrofit retrofit = new Retrofit.Builder(). addConverterFactory(GsonConverterFactory.create()). baseUrl("你的地址").

2017-11-24 10:14:40 521

原创 OkHttp3源码解析

Request // url信息 private final HttpUrl url; // 请求方法 private final String method; // 头部信息 private final Headers headers; private final RequestBody body; private final Object tag; //缓存控制

2017-11-22 09:01:15 242

原创 Volley源码解析

Volley分为三个线程,主线程、缓存调度线程、网络调度线程。当要执行request时,需要先将request加入到缓存调度队列,如果发现有相应的缓存结果,则将该结果解析然后回调到主线程;当没有发现相应的缓存调度结果时,发送Http请求,解析响应,写入缓存,回调响应结果到主线程RequestQueue queue= Volley.newRequestQueue(getApplicationConte

2017-11-14 08:17:56 132

原创 SparseArray 源码解析

SparseArray,即稀疏数组,作为一种数据结构,拥有比HashMap更高的执行效率(HashMap的装箱操作使其比SpaseArray慢,如果不考虑装箱拆箱,HashMap效率会比SparseArray高),且SparseArray对内存的使用比HashMap要少,在某些情况下,SparseArray是一种较优选择。SparseArray源码: private int[] mKeys;

2017-10-11 13:41:30 243

原创 LruCache 源码解析

LruCache 作为AS的自带类,实现了一种内存缓存策略——最近使用算法,即在满足所拥有的内存限制的条件下,缓存近期使用的数据,而当数据大小超出限时时,移除最久未被使用的数据。LruCache常用如图片等的缓存。下面来看源码。 private final LinkedHashMap<K, V> map; private int size; // 当前缓存大小 private

2017-10-04 08:58:10 257

原创 AsyncTask 源码解析

AsyncTask 是android里线程的使用方式之一,优点在于简单易用。它封装处理了异步消息处理,即Handler的使用方式。 AsyncTask保证线程操作处于后台线程,而在后台操作的前后,能在UI线程操作中使用AsyncTack执行相关的UI操作。AsyncTask是个抽象类,需要子类实例化使用。 下面是源码:protected abstract Result doInBackground(

2017-10-03 09:36:39 237

原创 Handler 源码解析

Handler作为android常用线程之一, 能够在线程里处理耗时操作,并通过发送Message的方式,更新UI。注意:android不允许在非UI线程更新U,为了能在子线程也就是非UI线程执行完后,能执行UI操作,封装了Handler。因此,学习Handler的运行机制,很有收益提及Handler , 不能避谈Message和Looper, 他们三者相互协作,构成了Handler的运作方式。下

2017-10-02 08:17:26 217

原创 快速排序之三向切分

在快速排序的基础上,将数组切分成三个部分,及大于、等于、小于三个部分,其中大于和小于部分继续递归快速排序,实现如下:note: **1. i于lt之间的偏离即为等于部分 2. lt 为左待排序数组上界位置 , gt 为右待排序数组下界位置**public static void sort(int[]a, int lo, int hi){ if (lo>=hi) return;

2017-09-16 08:34:06 869

原创 AIDL

为使应用程序之间能够彼此通信,Android提供了IPC (Inter Process Communication,进程间通信)的一种独特实现: AIDL (Android Interface Definition Language, Android接口定义语言 这里用单个程序实现 如果用C/S模式,在工程中定义服务端和客户端交互的接口,跟服务端的一模一样,包名也要一样, 不然会报错java.

2017-07-06 12:44:46 249

原创 Volley的简单使用

防止网络请求线程引起的内存泄漏,唯一实例RequestQueue,Context为整个程序的Context,新建MyApplication继承Application,实现唯一实例RequestQueuepublic class MyApplication extends Application { public static RequestQueue request; @Override

2017-07-06 11:39:25 178

转载 Android6.0 动态获取拨打电话授权

Android 6.0 以后需要拨打电话仅在AndroidManifest 声明权限不能拨出电话,需要在运行时获取授权才能获取权限,以下为解决方法:在点击触发按钮后,获取判断用户是否授权,如果授权,则拨打电话,否则提示用户进行授权: AndroiManifest.xml文件的权限声明必不可少 <uses-permission android:name="android.permission

2017-06-06 16:16:54 1345

原创 APP 广告UI

APP 首页常为一个广告推送页面,在运行若干时间后自动跳转下一页面,在此过程中,用户可以点击跳过以提前结束当前页面,跳转到相应的界面页面效果类似: 主要功能集中在右上角的按钮,包含计时,点击跳转以下为实现逻辑: 首先需要一个计时器,Android已封装好CountDownTimer的类能完成功能,此处创建一个MyCountDownTimer继承此类,需要实现方法: 1. public vo

2017-06-05 17:26:59 284

空空如也

空空如也

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

TA关注的人

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