自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 问答 (7)
  • 收藏
  • 关注

原创 Android图片三级缓存的原理及实现

为什么要使用三级缓存如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知所以提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量什么是三级缓存网络缓存, 不优先加载, 速度慢,浪

2021-12-19 15:49:07 310

原创 LayoutInflate布局加载原理详解

布局加载源码分析书接上文,从View的绘制流程开始:Window、DecorView、ViewRootImp详解View的绘制流程-measure、layout、draw先从Activity.setContentView开始简单回顾下布局是如何被加载的Activity.javapublic void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initW

2021-12-16 14:08:55 2406

原创 View的绘制流程-measure、layout、draw

承接上文——Window、DecorView、ViewRootImp详解我们打开一个Activity后,在ActivityThread中 的performLaunchActivity方法中,回调Activity onCreate()之前 会先调用Activity.attach(),这个方法中初始化了PhoneWindow和WindowManager对象。然后在resume之前,会将DecorView和WindowManager关联,WindowManager的具体实现类WindowManagerImpl把

2021-12-16 01:26:28 1984

原创 Window、DecorView、ViewRootImp详解

Window和DecorView的创建先从比较熟悉的activity.setContentView说起。Activity.javaprivate Window mWindow; ......public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar();} ......public .

2021-12-15 00:30:41 571

原创 Fragment启动流程分析

1.概述Fragment已经成为Android开发中应用比较广泛的方案了,几乎每一个APP都离不开它的影子。为了更深入的理解其中原理,我们从Fragment中源码开始分析。Fragment生命周期如果我们需要在Activity添加一个Fragment,代码如下://MainActivitypublic class MainActivity extends Activity{ ContentFragment mContentFragment; @Override protecte

2021-12-12 21:44:43 2235

原创 ThreadLocal 源码深入分析

以前只知道 ThreadLocal 的大致思路,没有去深入研究。今天读了读源码,果然博大精深~ThreadLocal 提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同,而同一个线程在任何时候访问这个本地变量的结果都是一致的。当此线程结束生命周期时,所有的线程本地实例都会被 GC。ThreadLocal 相当于提供了一种线程隔离,将变量与线程相绑定。ThreadLocal 通常定义为 private static 类型。假如让我们来实现一个变量与线

2021-12-07 23:26:57 206

原创 ContentProvider流程详解

ContentProvider是一种内容共享型组件,它通过Binder向其他组件乃至其他应用提供数据。当ContentProvider所在的进程启动时,ContentProvider会同事启动并被发布到AMS中。需要注意的是,这个时候ContentProvider的onCreate要先于Application的onCreate而执行,这是四大组件中一个少有的现象。当一个应用启动时,入口方法为ActivityThread的main方法,main方法是一个静态方法,在main方法中会创建ActivityThr

2021-12-07 20:58:21 1804

原创 BrocastReceiver流程详解

广播的注册分为静态注册,以及动态注册。静态注册是在xml中配置receiver节点,在应用程序启动后会解析xml文件,具体的注册流程是交给PackagerManagerService来处理。本篇文章主要分析广播的动态注册,也就是在Java代码中调用registerReceiver方法来注册广播,开发中具体的使用这里不再介绍。1.注册广播不管是在Activity,还是Service中注册广播,都是调用ContextWrapper$registerReceiver方法。其中,ContextWrapper是C

2021-12-05 01:13:09 376

原创 bindService流程详解

bindService的流程,入口同样在ContextImpl中。ContextImpl.javapublic boolean bindService(Intent service, ServiceConnection conn, int flags) { warnIfCallingFromSystemProcess(); return bindServiceCommon(service, conn, flags, mMainThread.getHandler(), Process.my

2021-12-04 19:29:28 1080

原创 startService流程详解

1.Service整体交互结构Service作为Android四大组件之一,其生命周期是通过system_server进程中的ActivityManagerService(AMS)管理的,大致了解Service通信过程中涉及到的几个主要角色。App端进程:ContextImplContext抽象类所有api的实现,是Service、Activity和其他组件base Context。ActivityThread代表着App的主线程,是App的入口,Application、Activ

2021-12-04 16:00:47 2939

原创 Activity的启动流程详解

前言activity启动的流程分为两部分:一是在activity中通过startActivity(Intent intent)方法启动一个Activity;二是我们在桌面通过点击应用图标启动一个App然后显示Activity;第二种方式相较于第一种方式更加全面,所以本文会以第二种流程来分析。简要我们手机的桌面是一个叫做Launcher的Activity,它罗列了手机中的应用图标,图标中包含安装apk时解析的应用默认启动页等信息。在点击应用图标时,即将要启动的App和Launcher、AMS、Zygot

2021-11-28 16:23:33 6721

原创 Java8特性——Lambda表达式

在 Java 8 以前,若我们想要把某些功能传递给某些方法,总要去写匿名类。以前注册事件监听器的写法与下面的示例代码就很像:manager.addScheduleListener(new ScheduleListener() { @Override public void onSchedule(ScheduleEvent e) { // Event...

2019-12-22 23:59:21 205

原创 Android设计模式之策略模式

1.前言策略模式在开发中也常常用到,当实现某一个功能时如支付功能时,支付功能可以有多种实现方式,比如微信支付、支付宝支付、一网通支付。再比如实现分享时也可以有多种策略,可以分享到QQ、微信、微博等社交平台。在众多的实现方式中,可以将功能中涉及到的通用方法或策略提取出来,提供一个统一的接口,不同的算法或者策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态策略...

2019-12-22 22:12:37 253

原创 Android Sutdio类结构查看工具Structure详解

android studio可以非常方便地查看当前类的结构,包括类的方法与成员变量等等。只须点击Project栏下侧的Structure即可查看类的结构。里面的工具栏可以对类的信息进行筛选,非常方便。所谓工欲善其器,必先利其器,现将类结构的图标含义与头栏工具选项的作用详细研究一番,将心得记录归纳,以免遗忘,如有错误之处,还请各位同学指出。TextView的类结构信息如下图(筛选全选)1...

2019-11-15 19:13:58 814

原创 OkHttp 源码解析(三)

简介上一篇文章分析了 OkHttp 建立连接的过程,主要涉及到的几个类包括 StreamAllocation、RealConnection 以及 HttpCodec,其中 RealConnection 封装了底层的 Socket。Socket 建立了 TCP 连接,这是需要消耗时间和资源的,而 OkHttp 则使用连接池来管理这里连接,进行连接的重用,提高请求的效率。OkHttp 中的连接池由 ...

2019-10-26 10:05:03 189

原创 OkHttp 源码解析(二)

简介上本文主要看一下 RetryAndFollupInterceptor 并引出建立连接相关的分析。RetryAndFollowUpInterceptorInterceptor 最主要的代码都在 intercept 中,下面是 RetryAndFollowUpInterceptor#intercept 中的部分代码:@Override public Response intercept(...

2019-10-26 10:00:20 215

原创 OkHttp源码解析(一)

简介OkHttp 是一款用于 Android 和 Java 的网络请求库,也是目前 Android 中最火的一个网络库。OkHttp 有很多的优点:在 HTTP/2 上允许对同一个 host 的请求共同一个 socket连接池的使用减少请求延迟(如果 HTTP/2 不支持)透明的 GZIP 压缩减少数据量大小响应的缓存避免重复的网络请求基本用法下面是 OkHttp 的使用示例:...

2019-10-24 20:44:13 165

原创 TCP之三次握手和四次挥手

TCP定义(摘自维基百科):传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,用户数据报协议(UDP)是同一层内另一个重要的传输协议。通过以上的定义我们知道,TCP是网络七层模型中传输层的协议。数...

2019-10-22 22:48:45 106

原创 深入理解ReentrantLock

一、 概述本文首先介绍Lock接口、ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结。本文不涉及ReentrantLock中的条件变量。1.1、Lock接口Lock接口,是对控制并发的工具的抽象...

2019-10-07 16:49:18 113

原创 Android虚拟机及编译过程

一、什么是Dalvik虚拟机Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Andro...

2019-09-26 19:19:50 569

原创 Activity、Window、DecorView与ViewRoot之间的关系

1.概述ActivityActivity负责控制生命周期和处理事件,负责统筹视图的添加与显示,以及通过一些回调方法与Window和View进行交互。一个Activity包含一个Window,真正控制视图的是Window,Window才是真正代表一个窗口。WindowWindow是视图的承载者,是一个抽象类,Activity中持有的实际上是Window的子类PhoneWindow,Windo...

2019-09-25 19:29:37 1266

转载 RxJava源码解析

转自:https://blog.csdn.net/sted_zxz/article/details/82317400本文基于RxJava2.2.1版本分析。简介官方介绍:RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based...

2019-09-19 17:58:37 113

原创 Java中的静态代理与动态代理

一、代理模式**定义:**给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。1、代理模式的理解代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。现实世界的代理人被授权执行当事人的一些事宜,无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上代理人是要有当事人的授权,并且在核心问题上...

2019-09-12 20:18:13 128

原创 JVM之GC总结

什么是垃圾回收垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析...

2019-09-12 14:52:40 140

原创 Rxjava入门之创建操作符+网络轮询实例

Rxjava提供了丰富、功能强大的操作符,几乎能完成所有功能的需求,这篇文章主要详细介绍Rxjava中最常用的创建操作符。1.基本创建需求场景完整的创建被观察者对象对应操作符类型create()作用完整创建一个被观察者对象(Observable)具体使用/ ** * 1. 通过creat()创建被观察者 Observable 对象 */ Obser...

2019-09-08 11:01:57 137

原创 RxJava入门之基本使用

1.简介Rxjava 是一个 基于事件流、实现异步操作的库,类似于 Android中的 AsyncTask 、Handler作用,由于其基于事件流的链式调用、逻辑简洁使用简单的特点,深受各大 Android开发者的欢迎。Rxjava基于一种扩展的观察者模式4种不同角色:被观察者(Observable):产生事件观察者(Observer):接收事件,并给出响应动作订阅(Subscribe...

2019-09-07 11:23:54 179

原创 Handler内存泄漏原理解析

1. 简介在写Android应用程序时,Handler应该是很常见的一个类。我们一般在使用该类时有采用如下方法:// 1.新建一个匿名的Handler内部类,并重写handleMessageprivate Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {...

2019-09-04 23:45:28 158

原创 深入理解ConcurrentHashMap源码

Java7中的 ConcurrentHashMapconcurrencyLevel:并行级别、并发数、Segment数,默认为16,也就是说ConcurrentHashMap有16个Segment,此时,理论上来说最多可以同时支持16个线程并发写,只要他们的操作分别分布在不同的Segment上。这个值可以在初始化的时候设置为其他值,但是一旦初始化后,他是不可以扩容的。具体到每个Segment...

2019-08-07 17:19:53 326

原创 Java并发之死锁

1.什么是死锁多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace) ) ,若无外力作用,这些进程(线程)都将无法向前推进。2.死锁产生的条件一般来说,要出现死锁问题需要满足以下条件:互斥条件:一个资源每次只能被一个线程使用。请求与...

2019-07-19 19:51:30 94

原创 红黑树的Java实现

1.红黑树的定义红黑树(Red-Black Tree,简称RB树),是一种特殊的二叉查找树,所以他也满足二叉查找树的特征:任意一个节点的值大于右子节点的键值,小于左子节点的键值。除此之外,红黑树还具备很多其他特征:1)每个节点都是红色或者黑色2)根节点必定为黑色3)每个叶节点(左右子节点都为null的节点)必定是黑色4)如果一个节点是红色的,他的子节点必须是黑色的(反之则不一定),也就是...

2019-06-12 11:44:53 165

原创 二叉树的广度优先遍历BFS和深度优先遍历DFS

1.广度优先遍历英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。对于上面的例子来说,广度优先遍历的 结果是:A,B,C,D,E,F,G,H,I(假设每层节点从左到右访问)。先往队列中插入左节点,再插右节点,这样出队就是先左节点后右节点了。  广度优先遍历树,需要用到队列(Queue)来存储节点对...

2019-06-03 14:13:01 740

原创 CAS操作

乐观锁和悲观锁CPU是时分复用的,也就是把CPU的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换。然后重新加载新的thread所需数据。当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify,notifyAll唤醒回来。在某个资源不可用的时候,就将CPU让出,把当前等待线程切换为阻塞状态,等到共享资源...

2019-03-13 16:05:47 319

原创 深入理解synchronized实现原理

Java允许多线程并发控制,当多个线程同时操作一个共享资源时,可能会导致数据更新不同步,从而每个线程拿到的数据经过其他线程的修改,相互之间产生冲突。因此加入了同步锁以避免在该线程没有操作完成之前,被其他线程修改共享资源,保证了数据的唯一性和准确性。synchronized的基本使用基本使用:https://blog.csdn.net/m0_37698652/article/details/78...

2019-03-04 15:32:06 613

原创 Android框架学习—EventBus源码分析

参考文章:https://blog.csdn.net/u011240877/article/details/73196808https://blog.csdn.net/sted_zxz/article/details/79949465EventBus是一个事件发布/订阅轻量级框架,能够简化组件间的通信,有效地将事件发送者和订阅者解耦,能避免复杂的依赖性和生命周期问题。EventBus可以代替...

2019-02-25 14:03:44 272

原创 Android音视频处理—通过MediaMuexr合成MP4文件

参考文章:http://blog.51cto.com/ticktick/17107431.MP4基本概念MP4文件中的所有数据都装在box(QuickTime中为atom)中,也就是说MP4文件由若干个box组成,每个box有类型和长度,可以将box理解为一个数据对象块。box中可以包含另一个box,这种box称为container box。一个MP4文件首先会有且只有一个“ftyp”类型的b...

2019-02-11 16:46:50 1181 1

原创 Java内存模型JMM

由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是引入了一个新的问题:缓存...

2018-04-03 13:20:24 138

原创 Java对象的创建、内存布局、访问定位

转自:Java对象的创建、内存布局、访问定位对象的创建一个简单的创建对象语句Clazz instance = new Clazz();包含的主要过程包括了类加载检查、对象分配内存、并发处理、内存空间初始化、对象设置、执行ini方法等。主要流程如下: 1. 类加载检查JVM遇到一条new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引...

2018-04-02 10:42:29 154

原创 JVM内存:年轻代、老年代、永久代

参考文章:JVM内存:年轻代,老年代,永久代Java中堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象和数组,如下图所示:在Java中,堆被划分成两个不同的区域:年轻代、老年代。年轻代(Young)又被划分为三个区域:Eden、S0、S1。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存的分派以及回收。 堆是GC收集垃圾的主要区域。GC分为两种:M...

2018-03-25 21:10:35 5950 1

原创 JVM内存模型

参考:JVM内存模型(深入理解Java虚拟机学习笔记)JVM实现了Java语言的平台无关性,.java文件经过编译器编译后生成了.class的Java字节码文件,由JVM执行,虚拟机在执行字节码时,将字节码解释成具体平台的机器指令,屏蔽了平台相关的信息,实现了平台无关性。JVM内存模型JVM = 类加载器classloader + 执行引擎executionengine + 运...

2018-03-24 21:38:28 478

原创 String,StringBuilder,StringBuffer的区别

1.运行速度 从运行速度上来说:StringBuilder > StringBuffer > String String之所以最慢是因为String是字符串常量,一旦创建就不能改变,而StringBuilder和StringBuffer是字符串变量。String str="abc";System.out.println(str);str=str+"de";System.o...

2018-03-21 14:38:11 126

空空如也

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

TA关注的人

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