java
文章平均质量分 92
尤教授
这个作者很懒,什么都没留下…
展开
-
Android图片三级缓存的原理及实现
为什么要使用三级缓存如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量。在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知所以提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量什么是三级缓存网络缓存, 不优先加载, 速度慢,浪原创 2021-12-19 15:49:07 · 356 阅读 · 0 评论 -
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 · 2444 阅读 · 0 评论 -
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 · 2083 阅读 · 0 评论 -
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 · 646 阅读 · 0 评论 -
Fragment启动流程分析
1.概述Fragment已经成为Android开发中应用比较广泛的方案了,几乎每一个APP都离不开它的影子。为了更深入的理解其中原理,我们从Fragment中源码开始分析。Fragment生命周期如果我们需要在Activity添加一个Fragment,代码如下://MainActivitypublic class MainActivity extends Activity{ ContentFragment mContentFragment; @Override protecte原创 2021-12-12 21:44:43 · 2349 阅读 · 0 评论 -
ThreadLocal 源码深入分析
以前只知道 ThreadLocal 的大致思路,没有去深入研究。今天读了读源码,果然博大精深~ThreadLocal 提供了线程本地变量,它可以保证访问到的变量属于当前线程,每个线程都保存有一个变量副本,每个线程的变量都不同,而同一个线程在任何时候访问这个本地变量的结果都是一致的。当此线程结束生命周期时,所有的线程本地实例都会被 GC。ThreadLocal 相当于提供了一种线程隔离,将变量与线程相绑定。ThreadLocal 通常定义为 private static 类型。假如让我们来实现一个变量与线原创 2021-12-07 23:26:57 · 228 阅读 · 0 评论 -
ContentProvider流程详解
ContentProvider是一种内容共享型组件,它通过Binder向其他组件乃至其他应用提供数据。当ContentProvider所在的进程启动时,ContentProvider会同事启动并被发布到AMS中。需要注意的是,这个时候ContentProvider的onCreate要先于Application的onCreate而执行,这是四大组件中一个少有的现象。当一个应用启动时,入口方法为ActivityThread的main方法,main方法是一个静态方法,在main方法中会创建ActivityThr原创 2021-12-07 20:58:21 · 1885 阅读 · 0 评论 -
BrocastReceiver流程详解
广播的注册分为静态注册,以及动态注册。静态注册是在xml中配置receiver节点,在应用程序启动后会解析xml文件,具体的注册流程是交给PackagerManagerService来处理。本篇文章主要分析广播的动态注册,也就是在Java代码中调用registerReceiver方法来注册广播,开发中具体的使用这里不再介绍。1.注册广播不管是在Activity,还是Service中注册广播,都是调用ContextWrapper$registerReceiver方法。其中,ContextWrapper是C原创 2021-12-05 01:13:09 · 400 阅读 · 0 评论 -
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 · 1149 阅读 · 0 评论 -
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 · 3035 阅读 · 0 评论 -
Activity的启动流程详解
前言activity启动的流程分为两部分:一是在activity中通过startActivity(Intent intent)方法启动一个Activity;二是我们在桌面通过点击应用图标启动一个App然后显示Activity;第二种方式相较于第一种方式更加全面,所以本文会以第二种流程来分析。简要我们手机的桌面是一个叫做Launcher的Activity,它罗列了手机中的应用图标,图标中包含安装apk时解析的应用默认启动页等信息。在点击应用图标时,即将要启动的App和Launcher、AMS、Zygot原创 2021-11-28 16:23:33 · 7813 阅读 · 0 评论 -
Java8特性——Lambda表达式
在 Java 8 以前,若我们想要把某些功能传递给某些方法,总要去写匿名类。以前注册事件监听器的写法与下面的示例代码就很像:manager.addScheduleListener(new ScheduleListener() { @Override public void onSchedule(ScheduleEvent e) { // Event...原创 2019-12-22 23:59:21 · 232 阅读 · 0 评论 -
Android设计模式之策略模式
1.前言策略模式在开发中也常常用到,当实现某一个功能时如支付功能时,支付功能可以有多种实现方式,比如微信支付、支付宝支付、一网通支付。再比如实现分享时也可以有多种策略,可以分享到QQ、微信、微博等社交平台。在众多的实现方式中,可以将功能中涉及到的通用方法或策略提取出来,提供一个统一的接口,不同的算法或者策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态策略...原创 2019-12-22 22:12:37 · 280 阅读 · 0 评论 -
深入理解ReentrantLock
一、 概述本文首先介绍Lock接口、ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结。本文不涉及ReentrantLock中的条件变量。1.1、Lock接口Lock接口,是对控制并发的工具的抽象...原创 2019-10-07 16:49:18 · 133 阅读 · 0 评论 -
Android虚拟机及编译过程
一、什么是Dalvik虚拟机Dalvik是Google公司自己设计用于Android平台的Java虚拟机,它是Android平台的重要组成部分,支持dex格式(Dalvik Executable)的Java应用程序的运行。dex格式是专门为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。Google对其进行了特定的优化,使得Dalvik具有高效、简洁、节省资源的特点。从Andro...原创 2019-09-26 19:19:50 · 598 阅读 · 0 评论 -
Activity、Window、DecorView与ViewRoot之间的关系
1.概述ActivityActivity负责控制生命周期和处理事件,负责统筹视图的添加与显示,以及通过一些回调方法与Window和View进行交互。一个Activity包含一个Window,真正控制视图的是Window,Window才是真正代表一个窗口。WindowWindow是视图的承载者,是一个抽象类,Activity中持有的实际上是Window的子类PhoneWindow,Windo...原创 2019-09-25 19:29:37 · 1325 阅读 · 0 评论 -
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 · 132 阅读 · 0 评论 -
Java中的静态代理与动态代理
一、代理模式**定义:**给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象。1、代理模式的理解代理模式使用代理对象完成用户请求,屏蔽用户对真实对象的访问。现实世界的代理人被授权执行当事人的一些事宜,无需当事人出面,从第三方的角度看,似乎当事人并不存在,因为他只和代理人通信。而事实上代理人是要有当事人的授权,并且在核心问题上...原创 2019-09-12 20:18:13 · 148 阅读 · 0 评论 -
JVM之GC总结
什么是垃圾回收垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。Java 语言出来之前,大家都在拼命的写 C 或者 C++ 的程序,而此时存在一个很大的矛盾,C++ 等语言创建对象要不断的去开辟空间,不用的时候又需要不断的去释放控件,既要写构造函数,又要写析...原创 2019-09-12 14:52:40 · 161 阅读 · 0 评论 -
Java中Synchronized的用法
synchronized是Java中的关键字,是一种同步锁,当它用来修饰一个方法或者一个代码块的时候,能够保证同一时刻最多只有一个线程执行该段代码。1. 修饰一个代码块,作用对象是调用这个代码块的对象; 2. 修饰一个方法,作用对象是调用这个方法的对象; 3. 修饰一个静态的方法,作用对象是这个类的所有对象; 4. 修饰一个类,作用对象是这个类的所有对象。修饰一原创 2017-11-28 16:29:55 · 250 阅读 · 0 评论 -
volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们原创 2018-01-30 14:19:34 · 189 阅读 · 0 评论 -
View的事件分发机制源码解析
1.点击事件的传递规则点击事件的分发就是对MotionEvent事件的分发过程,即当一个MontionEvent产生以后,系统需要把这个事件传递给一个具体的View,传递的过程就是分发过程。 点击事件的分发由三个方法共同完成dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。1).public boolean dispatchT...原创 2018-02-22 21:41:55 · 186 阅读 · 0 评论 -
JVM内存模型
参考:JVM内存模型(深入理解Java虚拟机学习笔记)JVM实现了Java语言的平台无关性,.java文件经过编译器编译后生成了.class的Java字节码文件,由JVM执行,虚拟机在执行字节码时,将字节码解释成具体平台的机器指令,屏蔽了平台相关的信息,实现了平台无关性。JVM内存模型JVM = 类加载器classloader + 执行引擎executionengine + 运...原创 2018-03-24 21:38:28 · 503 阅读 · 0 评论 -
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 · 150 阅读 · 0 评论 -
JVM内存:年轻代、老年代、永久代
参考文章:JVM内存:年轻代,老年代,永久代Java中堆是JVM所管理的最大的一块内存空间,主要用于存放各种类的实例对象和数组,如下图所示:在Java中,堆被划分成两个不同的区域:年轻代、老年代。年轻代(Young)又被划分为三个区域:Eden、S0、S1。这样划分的目的是为了使JVM能够更好的管理堆内存中的对象,包括内存的分派以及回收。 堆是GC收集垃圾的主要区域。GC分为两种:M...原创 2018-03-25 21:10:35 · 5988 阅读 · 1 评论 -
Java内存模型JMM
由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了。基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾,但是引入了一个新的问题:缓存...原创 2018-04-03 13:20:24 · 157 阅读 · 0 评论 -
深入理解synchronized实现原理
Java允许多线程并发控制,当多个线程同时操作一个共享资源时,可能会导致数据更新不同步,从而每个线程拿到的数据经过其他线程的修改,相互之间产生冲突。因此加入了同步锁以避免在该线程没有操作完成之前,被其他线程修改共享资源,保证了数据的唯一性和准确性。synchronized的基本使用基本使用:https://blog.csdn.net/m0_37698652/article/details/78...原创 2019-03-04 15:32:06 · 633 阅读 · 0 评论 -
CAS操作
乐观锁和悲观锁CPU是时分复用的,也就是把CPU的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换,也就是会发生进程的切换。然后重新加载新的thread所需数据。当一个线程被挂起时,加入到阻塞队列,在一定的时间或条件下,在通过notify,notifyAll唤醒回来。在某个资源不可用的时候,就将CPU让出,把当前等待线程切换为阻塞状态,等到共享资源...原创 2019-03-13 16:05:47 · 346 阅读 · 0 评论 -
红黑树的Java实现
1.红黑树的定义红黑树(Red-Black Tree,简称RB树),是一种特殊的二叉查找树,所以他也满足二叉查找树的特征:任意一个节点的值大于右子节点的键值,小于左子节点的键值。除此之外,红黑树还具备很多其他特征:1)每个节点都是红色或者黑色2)根节点必定为黑色3)每个叶节点(左右子节点都为null的节点)必定是黑色4)如果一个节点是红色的,他的子节点必须是黑色的(反之则不一定),也就是...原创 2019-06-12 11:44:53 · 190 阅读 · 0 评论 -
Java并发之死锁
1.什么是死锁多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力。然而,并发执行也带来了新的问题——死锁。死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局(Deadly-Embrace) ) ,若无外力作用,这些进程(线程)都将无法向前推进。2.死锁产生的条件一般来说,要出现死锁问题需要满足以下条件:互斥条件:一个资源每次只能被一个线程使用。请求与...原创 2019-07-19 19:51:30 · 117 阅读 · 0 评论 -
深入理解ConcurrentHashMap源码
Java7中的 ConcurrentHashMapconcurrencyLevel:并行级别、并发数、Segment数,默认为16,也就是说ConcurrentHashMap有16个Segment,此时,理论上来说最多可以同时支持16个线程并发写,只要他们的操作分别分布在不同的Segment上。这个值可以在初始化的时候设置为其他值,但是一旦初始化后,他是不可以扩容的。具体到每个Segment...原创 2019-08-07 17:19:53 · 358 阅读 · 0 评论 -
Handler内存泄漏原理解析
1. 简介在写Android应用程序时,Handler应该是很常见的一个类。我们一般在使用该类时有采用如下方法:// 1.新建一个匿名的Handler内部类,并重写handleMessageprivate Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {...原创 2019-09-04 23:45:28 · 178 阅读 · 0 评论 -
RxJava入门之基本使用
1.简介Rxjava 是一个 基于事件流、实现异步操作的库,类似于 Android中的 AsyncTask 、Handler作用,由于其基于事件流的链式调用、逻辑简洁使用简单的特点,深受各大 Android开发者的欢迎。Rxjava基于一种扩展的观察者模式4种不同角色:被观察者(Observable):产生事件观察者(Observer):接收事件,并给出响应动作订阅(Subscribe...原创 2019-09-07 11:23:54 · 207 阅读 · 0 评论 -
Rxjava入门之创建操作符+网络轮询实例
Rxjava提供了丰富、功能强大的操作符,几乎能完成所有功能的需求,这篇文章主要详细介绍Rxjava中最常用的创建操作符。1.基本创建需求场景完整的创建被观察者对象对应操作符类型create()作用完整创建一个被观察者对象(Observable)具体使用/ ** * 1. 通过creat()创建被观察者 Observable 对象 */ Obser...原创 2019-09-08 11:01:57 · 157 阅读 · 0 评论 -
HashMap与HashTable的区别
1、HashMap是非线程安全的,Hashtable是线程安全的HashMap是非线程安全的,同一时间可以有多个线程进行写操作。如果需要满足线程安全,可以用Collections.synchronizedMap()是HashMap具有线程安全的能力或者直接使用ConcurrentHashMap类。.Hashtable是一个遗留类,除了构造方法以外所有的public方法都用了sync原创 2017-11-29 14:57:35 · 152 阅读 · 0 评论