前言
在上一篇文章中介绍了Glide基本的调用流程,总结起来就是Engine
是真正加载资源的入口,SingleRequest
起到连接RequestManager
、Target
和Engine
的纽带关系,本文将承接上文,探讨Glide的加载流程。
本章要讨论的内容:
- Engine的工作流程;
- 内存缓存ActiveResource原理剖析;
- 内存缓存MemoryCache基本原理;
- EngineJob和DecodeJob的工作原理;
在讨论Engine之前,还是从调用它的地方开始SingleReques.onSizeReady
从Engine开始
前两天写Activity启动流程时挖个坑,ActivityThread调用Activity.resume后,紧接着调用WindowManager.addView()用来正在的显示View,之前讲的很草率,现在感觉有必要写一下WindowManager的调用流程。
本文基于android8.1.0_r15分支分析
WindowManager简单介绍
首先WindowManager是一个接口继承自ViewManager,它作用是用于窗口的管理,我们平时的使用比较多的是addView方法和LayoutParams参数,addView定义在基类ViewManager中,源码:
最近我开始学习framework,不想一上来就研究到c/c++层进程启动原理什么的,首先得从四大组件的启动流程入手学习,所以我决定写几篇博文,来记录整个过程的学习心得。
关于Activity的启动流程,我准备分成两个部分来写:app进程篇和system进程篇,作为一个应用层开发者,其实掌握前者已经够用了,第二篇作为提高,毕竟多了解一点也没有坏处,就这样吧。
本文主要基于
android8.1.0_r15
代码分支调试分析;
需要掌握的知识:
- Activity生命周期
- AIDL原理
- Handler机制
努力的人,应该像好色那样好学
做Android开发的同学,对Gradle肯定不陌生,我们用它配置、构建工程,可能还会开发插件来促进我们的开发,我们必须了解Gradle,而不仅限于只会当配置构建工具,我想学习它,于是就有了这一系列的文章。
看到这篇博客,能可能会学到什么?
- 了解Groovy,我们并不需要精通,试着把它当java来写
- 理解Groovy闭包,闭包是必须要理解的,特别是delegate
- 利用闭包来实现自己的DSL
开发环境:
开发工具:Intellij Ideal
jdk版本:jdk1.8
sdk版本:groovy sdk 2.4.10
具体用Ideal创建groovy的教程,比较简单,自行摸索
崔同学说逃避解决不了问题,那就勇敢面对。
两年前看过阮一峰老师的文章,认识了git分支管理策略,但那时项目代码是用SVN管理,接触git是因为github,github一直停留在单人单分支的阶段。后来换工作了必须用git,发现分支管理的强大之处,所以写一篇记录一下。
如何管理好git分支,国外的nvie发表了博客 a-successful-git-branching-model, 文章讲解了他是如何让自己的Git仓库保持整洁,阮一峰老师说的也是基于nvie的思想,推荐大家看完阮老师的文章,好好感悟感悟,然后在再来纠正一下我的理解,哈哈。
VRefreshLayout
一个竖直方向的下拉刷新控件,支持自定义Header,可配置参数,最重要的特点是刷新时头部置顶显示,且不影响列表滑动;
为什么要做头部置顶显示
现在越来越多的App下拉刷新时是置顶显示的,大家可以看手机京东
,天猫商城
,小米商城
,汽车之家
等APP,我们在下拉刷新时,头部的刷新视图是保持显示的,这样在滚动列表的时候,用户可以知道当前正在刷新状态,而传统的下拉刷新库,比如Android-PullToRefresh和android-Ultra-Pull-To-Refresh,是不支持的头部置顶显示的,用户往下翻看时,刷新状态就可能被隐藏;google的SwpieRefreshLayout是置顶层显示的,但是它的内容区域的不会跟着动的,且可定制性太差。
长时间阅读Android SDK源码,会发现Google喜欢用位运算,伴随的是代码中会定义一堆int类型的常量,乍一看很懵逼,特别是所在View相关的类里边,比如这些常量你可熟悉:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17static final int FLAG_CLIP_CHILDREN = 0x1;
private static final int FLAG_CLIP_TO_PADDING = 0x2;
static final int FLAG_INVALIDATE_REQUIRED = 0x4;
private static final int FLAG_RUN_ANIMATION = 0x8;
static final int FLAG_ANIMATION_DONE = 0x10;
private static final int FLAG_PADDING_NOT_NULL = 0x20;
private static final int FLAG_ANIMATION_CACHE = 0x40;
static final int FLAG_OPTIMIZE_INVALIDATE = 0x80;
static final int FLAG_CLEAR_TRANSFORMATION = 0x100;