Android源码
文章平均质量分 94
咸鱼谈何梦想
这个作者很懒,什么都没留下…
展开
-
Android屏幕刷新机制原理分析
基本概念CPU:执行应用层的measure、layout、draw等操作,绘制完成后,将数据交由GPUGPU:处理数据,将数据发送到缓冲区屏幕:由一个一个像素组成,以固定频率(1000ms,60次,即16.6ms一次)去缓冲区里读取数据填充像素点双缓冲机制看完上面的流程图,我们很容易想到一个问题,屏幕是以16.6ms的固定频率进行刷新的,但是我们应用层触发绘制的时机是完全随机的(比如我们随时都可以触摸屏幕触发绘制),如果在GPU向缓冲区写入数据的同时,屏幕也在向缓冲区读取数据,会发生什么情况呢?原创 2021-11-14 13:47:47 · 3140 阅读 · 0 评论 -
EventBus源码阅读
1、使用/*** 页面A*/// 注册EventBusEventBus.getDefault().register(this);@Subscribe(threadMode = ThreadMode.MAIN)public void callBack(String s) { // 事件处理}// 注销EventBus@Overrideprotected void onDestroy() { super.onDestroy(); EventBus.getDefault原创 2020-08-21 13:23:14 · 132 阅读 · 0 评论 -
Retrofit源码学习
老规矩,从使用的角度深入源码。一、创建Retrofit对象Retrofit retrofit = new Retrofit.Builder().baseUrl(url) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create()) .build(原创 2020-08-09 17:51:40 · 163 阅读 · 0 评论 -
OKHttp调用流程及源码分析
从使用入手,追踪调用代码。使用如下:// 通过Builder模式创建OkHttpClient对象OkHttpClient client = new OkHttpClient.Builder().build();// 通过Builder模式创建Request对象Request request = new Request.Builder().url("").build();// 创建Call对象Call call = client.newCall(request); try { // 同步请求原创 2020-08-05 23:58:18 · 261 阅读 · 0 评论 -
ConcurrentHashMap源码阅读
一、ConcurrentHashMap与HashMap、HashTable的区别1.HashMap我们知道HashMap是线程不安全的,在多线程环境下,使用HashMap进行put操作有可能引起数据丢失,也有可能因为扩容而导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。2.HashTableHashtable和HashMap的实现原理几乎一样,差别无非是(1)HashTable不允许key和value为null,而HashMap可以(2)HashTable是线程安全的,Ha原创 2020-08-05 09:04:02 · 106 阅读 · 0 评论 -
HashMap实现原理及源码分析
一、什么是哈希表数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找,斐波那契查找等方式,可将查找复杂度提高为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度也为O(n)线性链表:对于链表的新增,删除等操作(在找到指定操作位置后),仅需处理结点间的引用即可,时间复杂度为O(1),而查找操作需要遍历链表逐一进行比对,复杂原创 2020-08-05 09:03:13 · 145 阅读 · 0 评论 -
Glide源码分析(下)
into方法// DrawableRequestBuilder的into方法public Target<TranscodeType> into(ImageView view) { Util.assertMainThread(); if (view == null) { throw new IllegalArgumentException("You must pass in a non null View"); } if (!isTransfo原创 2020-08-05 09:02:38 · 146 阅读 · 0 评论 -
Glide源码分析(上)
先来看看Glide基本使用Glide.with(mContext).load(mUrl).into(imageView);那么我们就从with方法开始入手,with方法可以传入Context,Fragment,Activity等// Glide类的with方法public static RequestManager with(Context context) { RequestManagerRetriever retriever = RequestManagerRetriever.get(原创 2020-08-04 09:49:12 · 93 阅读 · 0 评论 -
IPC、Binder及AIDL原理机制
一、IPC介绍IPC是Inter-Process Communication的缩写,含义是进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。那么为什么需要开启多进程呢?原因有二,其一是一个应用因为某些原因需要独立运行在某个进程中。其二可能是加大一个应用可使用的内存空间,早期的一些版本,一个进程最大的内存空间是16MB。1、Android中开启多进程Android中开启多进程的方法只有一个,那就是给四大组件在Manifest中指定android:process属性,除此之外没有其他办法,也就原创 2020-08-04 09:46:44 · 320 阅读 · 0 评论 -
Future及AsyncTask源码解读
一、FutureTask及Future的使用一个可取消的异步计算,FutureTask提供了对Future的基本实现,可以调用方法去开始和取消一个计算,可以查询计算是否完成,可以获取异步计算的结果。1、基本使用方式一// FutureTask需要一个Callable对象FutureTask<String> task = new FutureTask<>(new Callable<String>() { @Override public String原创 2020-08-04 09:44:39 · 143 阅读 · 0 评论 -
View的测量、布局及绘制过程
一、Activity、Window及DecorView关系Activity:页面Window:交互窗口,是一个抽象类PhoneWindow:Window的唯一实现类DecorView:一个页面的根View,继承自FrameLayout既然我们知道整个View的Root是DecorView,那么View的绘制是从哪里开始的呢,我们知道每个Activity 均会创建一个 PhoneWindow对象,是Activity和整个View系统交互的接口,每个Window都对应着一个View和一个ViewRo原创 2020-08-03 11:11:03 · 259 阅读 · 0 评论 -
View事件分发源码解析
一、View的位置1、Left、Right、Top、Bottomleft = view.getLeft(); // 表示view的左边距离父控件左边的距离right= view.getRight(); // 表示view的右边距离父控件左边的距离top= view.getTop(); // 表示view的上边距离父控件顶部的距离bottom= view.getBottom(); // 表示view的下边距离父控件顶部的距离2、X、Y、TranslationX、TranslationYtran原创 2020-08-03 11:08:27 · 230 阅读 · 0 评论 -
编译时和运行时注解实现,案例ButterKnife
运行时注解,反射+注解的形式实现/** * 定义了一个用在属性上的运行时注解 */@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface BindView { int value();}@Retention定义了该注解被保留的时间长短,有三种值可以选择1、SOURCE,表示注解保留在源码层面,编译的后就会被擦除2、CLASS,表示注解只保留到编译阶段3、RUNTIME,表示注原创 2020-08-03 09:09:56 · 348 阅读 · 0 评论 -
Handler消息机制源码简析
Android中实现Handler的两种方式1.UI线程中创建Handler // 创建Handler private Handler mHandler = new MyHandler(); private static class MyHandler extends Handler { @Override public void handleMessage(Message msg) { // 处理消息原创 2020-08-03 08:43:12 · 133 阅读 · 0 评论