- 博客(154)
- 收藏
- 关注
原创 深入理解Java的内存模型与线程并发问题
文章大部分内容参考《深入理解Java虚拟机》!!!一、引言为什么要了解java的内存模型?java的内存模型是程序运行的基础知识,对于我们理解java的并发编程有一定的帮助,甚至一些并发知识的底层实现原理也是基于java的内存模型来实现的。计算机系统硬件与执行效率的一致性“让计算机并发执行若干个并发任务”与“更充分的利用计算机的处理器效能”之间的因果关系相对复杂,这种复杂性的来源是绝大多数的运算任务不可能只是靠处理器的“计算”就能完成。处理器至少要与内存进行交互,如读取运算数据、存储运算结果等,这个
2022-01-20 10:32:26
680
原创 Android的Handler基本原理源码分析
一、前言学习Android基础知识,都离不开handler,最开始最基础的使用从Handler.post去发送一个消息,Android系统的设计中,为了保证UI渲染的一致性(本质上线程并发问题)和无卡顿体验。耗时的操作需要放在工作线程中执行(一般是开发者自行创建的子线程)、Ui更新放在主线程。这样从各自职责上来讲是非常清晰的,Handler的出现的一个核心目的,就是解决工作线程处理的数据如何传递给Ui线程进行使用。**故而,**我们在研发中,子线程比如做耗时数据处理操作后,调用通过主线程创建的Handl
2022-01-13 19:28:36
2104
原创 Glide 4.12图片框架之多级缓存源码设计分析
一、Glide缓存初识在上两篇文章中,我们从源码角度分析Glide框架加载图片的流程、以及Glide图片通过巧妙的空view的Fragment的设计实现的Glide的图片加载的三大生命周期函数onStart、onStop、onDestroy。Glide的框架的源码量确实比较大,今天我们再详细分析一下,Glide的框架的缓存模块的设计。默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存:活动资源 (Active Resources) - 现在是否有另一个 View 正在展示这张图片
2021-12-28 19:32:12
950
原创 Glide 4.12 框架源码中的生命周期设计
在上一篇文章《最新源码Glide4.12框架之加载图片流程源码分析》中,我们主要做了对于通过Glide.with(this).load(url).into(target)的调用图片加载流程的的源码分析,以及对加载流程图的梳理。本篇文章主要对Glide图片框架的生命周期感知进行源码分析,体会Glide是如何做到感知Activity、Fragment的生命周期并控制自身图片加载过程的生命周期的。一、初识Glide图片加载生命周期深度的生命周期集成,以确保仅优先处理活跃的Fragment和Activity
2021-12-24 18:45:49
1345
原创 最新源码Glide4.12框架之加载图片流程源码分析
一、前言Android图片加载框架,在android应用开发中是一个常见的话题。在12、13年的时候我记得可能用的最多的是XUtils的一套框架(更早之前叫aFinal框架),这个框架中提供imageUtils用于在android应用的开发中完成远程图片的加载。再后来呢,有Picasso、Fresco、Glide。而这几年的开发经验来看,Glide最为流行。不信,可以查看github上项目地址,分别对比对比watch数、fork数、star数,就能确定Glide确实最为流行。如何对图片框架技术进行选型?
2021-12-23 22:09:20
2097
原创 OkHttp源码中Dispatcher和connectionPool线程池分析
在前面《OkHttp原理流程源码分析》中梳理分析了OkHttp中同步发起网络请求和异步发起网络请求,最终的请求分发是有Dispatcher分发器来完成的,Dispatcher分发器的实现中涉及到的线程池的应用代码,并未做分析,今天我们先看第一个线程池应用,Dispatcher中的线程池实现。一、OkHttp中Dispatcher的线程池实现异步网络请求最终会被Dispatcher统一管理调度,client.dispatcher().enqueue(new AsyncCall(responseCallba
2021-12-20 16:14:17
1372
原创 OkHttp原理流程源码分析
OkHttp已经是非常流行的android客户端的网络请求框架,我其实在项目中使用也已经好几年了,之前一直把重心放在如何快速的搞定业务上、迭代的效率上,这一点来讲,对于一个公司优秀员工是没有毛病的。但是越到后面,你会发现,真正的高效,是你对技术的更深层次的理解,对技术更熟练的掌握。所以今天重回技术本身,搞清楚OkHttp的实现机制和部分源码分析,也提醒阅读本篇文章的同学,除了在公司加班加点赶业务进度的同时,从长远角度看,提深自我的技术技能,才是对公司和自己的双赢结果。“OkHttp 4.x upgrade
2021-12-17 15:50:50
625
原创 详解Jvm内存结构
近期在学习研究内存,那么Jvm内存结构和Jvm的内存模型即JMM(Java momery model)这两项内容都是学习java虚拟机、java内存知识的基础。为了让自己加深理解,有不至于嵌入到底层细节太深,会通过一段代码片段类比到内存结构图中的真实呈现。一、Jvm体系的内存结构图JVM运行数据区,也就是我们所说的内存结构主要分为两个大区:1、线程共享区**方法区(Method Area)????*存储运行时的常量池、被虚拟机加载过的类信息、常量、静态变量、即时编译器编译后的代码数据。**堆区(
2021-12-10 20:40:24
2720
原创 Android中的内存泄漏和内存溢出
一、内存溢出和内存泄漏的概念理解**内存溢出:**是指程序代码片段被执行申请内存时,没有足够的内存空间,导致OOM异常。OOM:即内存溢出,out of momery。Android系统为每一个应用程序申请的内存是有限的(为什么如此设计,在dalvik虚拟机章节已经说明),一般为64M或者128M等,国内手机产商修改rom后,也会有所不同。我们可以在清单文件中配置android:largeheap=“true”,从而可给app申请更大的手机内存空间。**内存泄漏:**内存泄漏是指程序在申请内存后,
2021-12-09 15:47:23
3676
原创 虚拟机之Jvm、dalvik、art联系和区别
一、了解JVMJVM: java virtual machine,缩写JVM,一种能够执行java bytecode的虚拟机器,本质上是一种软件实现,也可以理解成以一条运行java bytecode的底层程序。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。实际上,并不是仅有java源代码,能编译生成.class文件,也就是我们所说的字节码文件,下面是引用一张维基百科的图:同样,python源码程序,也能最终编译成.class/.jar文件。二、Jvm、dalv
2021-12-08 10:43:36
3900
原创 LaucherActivity的源码分析和应用(非launcher桌面应用)
一、启动初探”在android手机上,当我们点击桌面上的按钮启动一个应用,就能打开应用的界面。这里我们所说的桌面其实就是android系统启动后的就已经帮我们运行的第一个程序,launcher程序。launcher程序可以理解为作为其它应用app入口管理的一个系统自带的app,正常情况下,安装一个新的应用,就会在桌面(laucher)程序中显示一个相应的图标。上述点击桌面上的图标打开应用的过程,本质上是通过lancher应用的提供的桌面图标启动另一个app的过程,并打开了新应用的首个Activity。
2021-11-23 22:52:30
2307
原创 通过自定义View了解MeasureSpecMode
一、自定义View的基本步骤本篇文章的核心知识点,并不是自定义View的全部讲解,主要是通过一个简单的demo了解自定义View的MeasureSpecMode模式。自定义View基本分为自定义View和自定义ViewGroup。自定义View的步骤:继承View重写构造方法(有四个构造方法,不同的使用场景可以了解下)自定义属性,在构造方法中初始化属性重写onMeasure方法测量宽高重写onDraw方法绘制控件关于View的绘制流程中,三个核心的回调方法onMeasure、onLayo
2021-11-21 14:32:28
2000
原创 Android系统启动流程分析
一、启动初探在android手机上,当我们点击桌面上的按钮启动一个应用,就能打开应用的界面。这里我们所说的桌面其实就是android系统启动后的就已经帮我们运行的第一个程序,launcher程序。launcher程序可以理解为作为其它应用app入口管理的一个系统自带的app,正常情况下,安装一个新的应用,就会在桌面(laucher)程序中显示一个相应的图标。上述点击桌面上的图标打开应用的过程,本质上是通过lancher应用的提供的桌面图标启动另一个app的过程,并打开了新应用的首个Activity。
2021-11-20 16:51:46
4528
原创 CopyOnWriteArrayList实现原理源码分析
针对于并发场景下动态数组的选型,可以使用线程安全的列表Vector,Vector是jdk1.0版本就带有的一个线程安全的动态数组类,但是Vector的实现原理之前分析过,对于所有对内部存储数据结构的操作,都添加了同步锁,这样的实现方式,虽然保证了线程的安全性,大并发场景下,却等同于多个线程的串行化执行,效率低下。jdk1.5引入了新的线程安全的列表实现CopyOnWriteArrayList。一、CopyOnWriteArrayList的实现类图类图结构和ArrayList完全一致,这个也合理,从Co
2021-11-11 16:40:56
3304
原创 基于android10.0源码分析Activity的启动流程
一、梳理源码流程干什么Activity是四大组件中最重要的组件之一,下面来分析Activity的启动过程,了解Activity的启动过程能帮助我们更好的对组件Activity的理解,也能帮助我们更好的把控Activity生命周期的变化过程。当然Activity作为四大组件之首,10.0版本的Activity的代码函数在8000行,关联的一些类Instrumentation、ActivityTaskManager、ActivityStarter等等,怎么也是几万行的代码,一次完全分析起来会很困难,这里面主
2021-11-07 12:12:37
1522
原创 JDK1.8版本HashMap源码原理分析
HashMap是一个KV的容器对象,也是日常在开发当中非常常用的对象,比如我们可能经常做一些内存缓存的时候,很多时候就选用HashMap这种KV的数据结构。在实现原理上,是基于哈希表的Map接口实现,是常用的java集合之一,非线程安全的。HashMap可以存储null的key和value,但是null作为键值只能有一个,做为值的话,可以是多个。这和Map的键要保持唯一性并不冲突。一、HashMap的类图结构二、概念、原理概述Jdk1.8之前的HashMap是由数组+链表作为底层数据结构实现的,数
2021-10-27 18:57:56
918
2
原创 Vector实现原理源码分析
Vector在jdk1.0版本就存在的一个并发列表类,Vector和ArrayList实现了非常相似的接口,集成了相同的类。和ArrayList不同的是,Vector是线程安全的,大部分的对外暴露的公共方法上,都添加了synchronized同步锁,很显然,同步锁的加入,使得Vector的性能并不高,要使用线程安全的List,则推荐CopyOnWriteArrayList。一、Vector的类结构从类的结构图看,Vector的类结构体系基本和ArrayList一致。二、源码分析/** * 存储元
2021-09-29 17:50:14
1768
原创 集合对象-ArrayList实现原理源码分析
集合对象-ArrayList实现原理源码分析最近再重看并发编程,又有新的体会,读书真是一个神奇的事情,读书能够提升认知水平,认知水平提高后,再复读往往能够获得新知。扯远了,在读构建线程安全类章节中,看到了CopyOnWriteArrayList,今天咱们结合ArrayList,Vector做一个简单的对比记录。主要从以下几个维度来看他们之间的联系和差别,比如代码底层的数据结构的实现、扩容机制上的区别、是否线程安全、性能上的差别。一、ArrayList继承体系图:ArrayList直接实现了了四个
2021-09-29 16:04:57
228
原创 代理设计模式
今天在看Spring Aop,Aop在设计上使用的动态代理的设计模式,因此来对代理设计模式做一个系统性的复习总结,思考代理设计模式在实际架构工作中,以及业务代码的设计中所可能的实际应用场景。首先,代理设计模式是一种结构型设计模式。代理设计模式是一种使用率非常高的设计模式,其定义是为其它对象提供一种代理以控制这个对象的访问。这个“控制”指对原有对象中的方法控制,既可以是增强,也可以是限制。联想一下,我们在实际生活中的一个代理场景,租房经纪人,租房经纪人是对实际房东的代理,经纪人操作着房东房子的租用权利;对
2021-08-11 14:08:21
226
原创 MVC和三层架构之间的关系
作为一名Android研发,最近再研究一些服务端的开发,遇到一个问题“Mvc和三层架构之间的关系是啥”。参考了一些资料,做一些记录。现在服务端JavaWeb开发比较流行的是使用脚手架SpringBoot框架来进行开发,SpringBoot能很方便的实现SSM框架的服务端架构。下面拿SSM框架和三层架构进行比较分析。一、三层架构三层架构是指:视图层View、服务层Service、持久层Dao,分别完成不同的功能。View层:用于接收用户提交请求的代码。Service层:系统的业务逻辑。Dao层:直
2021-07-07 18:02:27
2144
8
原创 Spring、SpringBoot、SpringCloud的关系
SpringSpring框架,是一套为了解决企业应用开发的复杂性而创建的框架,为开发java应用程序提供了全面的基础架构的支持。它提供了依赖注入和“开箱即用”的一些模块。如Spring Mvc、Spring Jdbc、Spring Security、Spring AOP、Spring IOC、Spring ORM、Spring Test等等。这些程序大大的缩短应用开发的时间,提高了开发应用功能程序的效率。(摘自Spring Boot 实战派)。Spring的官方首页文档中针对“Why spring?”做
2021-06-25 21:42:48
455
原创 SpringBoot的常用注解
SpringBoot的常用注解注解式编程是当先流行性的趋势,注解式的编程的内在的底层逻辑“约定大于配置”,代码的封装会更加的严密,开发人员将更多的关注代码的整体优化和业务逻辑上,所以注解式的编程会被更加广泛的应用。约定大于配置对于约定大于配置的趋势理解:开发人员仅仅需要规定应用中不符合约定的部分在没有规定配置的地方,采用默认配置,默认配置往往是通用且必要配置核心思想是推荐默认配置的思想,那么这个遵循默认的通用配置就是约定大于配置的核心思想,约定大于配置其实是工程标准化的体现,标准化带来的是效
2021-06-25 21:39:17
256
原创 网络分层模型、协议以及理解
OSI七层网络分层模型:参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。为什么网络进行网络层次划分?开闭原则。其实,大部分事实的道理都存在共性,随着人们对网络传输过程认知不断提升,人们发现网络传输实在是太复杂了,既要确定传输的信号是什么,还要确定给谁传输,还有各种中传输过程中的控制逻辑,容错逻辑等等。在软件工程OOD思想中,最顶层的原则就是开闭原则,网络分层的原因,有何尝不是如此,控制了层层之间的边界,每一层承.
2021-06-03 15:03:41
679
1
原创 解决ifelse过多问题
问题if else过多问题可以分成三类问题:if…else 过多逻辑表达式复杂嵌套过深本节只讨论过多问题:public void test(){ if(condition1){ //do something &nbs...
2020-04-30 16:54:55
2393
原创 算法基础回顾-时间复杂度和空间复杂度
时间复杂度和空间复杂度主要还是从算法所占用的「时间」和「空间」两个维度去考量。时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。时间复杂度时间复杂度使用大O表示法,在大O符号表示法中,时间复杂度的公式是: T(n) = O( f(n) ),其中f(n) 表示每行代码执行次数之和,而 O...
2020-04-29 10:55:59
389
原创 FLAG_ACTIVITY_CLEAR_TOP和singleTask的区别
Activity的Flags的设置,可以让Activity的运行具有一些特殊的特性,比如有些可以产生和启动模式相同或相似效果的,还有比如Activity在非前台的时候,也不会保存后台的历史列表中。本文重点分析FLAG_ACTIVITY_CLEAR_TOP,也简单介绍一下其它几个常用的Flag以及使用场景FLAG_ACTIVITY_NEW_TASK将Activity指定为singleTas...
2019-12-09 09:47:04
1395
1
原创 Activity之taskAffinity任务相关性场景分析
TaskAffinity,两个英文单词的组合,直译为任务相关性,可以用来设置Activity任务栈任务相关性的一个属性,这个属性参数指出了Activity所希望进入的任务栈的名称。taskAffinity的特性结论:具有同一相关性的 Activity 归属同一任务(从用户的角度来看,则是归属同一“应用”)任务的相关性由其根 Activity 的相关性确定。(文中有测试分析)我们也可以为A...
2019-12-04 15:13:36
587
原创 通过使用场景彻底明白Activity启动模式
先给出结论:Activity的启动模式的设计的主要目的是为了解决应用页面交互需求的不同场景。具体不同的启动模式,适合解决什么样的场景问题,我们先来看看Activity的启动模式都有哪些。1、standard标准模式在介绍标准模式之前,先介绍一下多个Activity实例在内存当中的维护数据结构是什么,所有的Activity实例被创建后,都会加入到栈数据结构中,在Android知识体系的术语中,...
2019-11-27 17:03:00
490
原创 Activity生命周期回顾
本文参考《Android 开发艺术探索》以上图片来源google官方指南关于Activity的总结,会本着结论先行的方式进行一、典型情况下的Activity的生命周期onCreate:Activity正在被创建,可以做一些初始化工作,比如setContentView去加载布局资源,初始化数据。onStart:Activity正在被启动,即将开始,Activity已经可见,但是并没有出...
2019-11-11 15:05:24
437
原创 View的Touch事件的分发系列-(1)ACTION_DOWN事件分发流程分析
在Android开发的知识体系中,其中View体系尤为重要,我们在平常的开发当中,无处不是View,很多人曾经都遇到过可滑动View嵌套的冲突问题,回想一下之前都是怎么处理的呢。还有一些在平常开发过程中需要去自定义开发的手势滑动交互的View,比如Android sdk提供了横向滑动的ViewPager,但是实际开发中,可能有垂直滑动的ViewPager的需求,如果我们自己开发,肯定离不开View...
2018-12-02 22:40:53
849
原创 setTheme(Theme_NoDisplay)巧妙使用
巧妙的而使用了setTheme(android.R.style.Theme_NoDisplay);这种方式解决了产品需求的变更。同样录制界面左侧的导入视频 同样也会经历编辑视频页面,在到编辑中...合成mp4进度页面。说明:合成视频的方
2016-12-10 17:18:20
6947
2
原创 Android官方Media Playback中文教程
此文参照 android developer API Guideshttps://developer.android.com/guide/topics/media/mediaplayer.htmlMedia Playback(媒体播放)Android 多媒体框架能够支持多种普通媒体类型,所以我们很容易的整合音频,视频,图片到我们的应用中来。这些多媒体的资源可以是
2016-06-20 23:34:18
5976
原创 MediaPlayer基础-生命周期状态分析
注:本文参照google apis:https://developer.android.com/reference/android/media/MediaPlayer.htmlMediaPlayer类可用于控制音频/视频文件和流的播放或回放(playback)。1.状态图:音频/视频文件和流的播放控制是使用一个状态机进行管理。下图显示了生命周期,并支持播放控制操作驱动的Medi
2016-06-20 23:21:10
1979
原创 观察者设计模式从无到有
声明:①此篇博文参照《设计模式之禅》,并对其中的demo场景做了相应的修改②此篇博文是分析观察者设计模式的从无到有。其中有四个版本的代码的演进,另外还包括java jdk提供的Obsevable.java和Obsever.java的使用的一个版本以及对其源码的简单分析。③如果只想使用ava jdk的观察者api,直接看demo源码中com.hym.observe;如果想自定义观察
2016-04-06 14:49:34
2380
原创 1.1listView优化之convertView
本篇是通用版的listView的优化,最终会使用模板设计模式和钩子方法对通用优化,再进行代码层级的深度优化。
2015-12-07 19:50:49
1112
原创 1.0 listview的adapter中getview的三种写法
说明:以下三个例子代码摘自google 2010 I/O大会getview的加载方法一般有以下三种种方式:最慢的加载方式是每一次都重新定义一个View载入布局,再加载数据public View getView(int position, View convertView, ViewGroup parent) { View item = mInflater.inflate(R.l
2015-12-07 19:37:55
3204
1
原创 listview中header和footer以及对postion等的处理
参考:http://892848153.iteye.com/blog/19236801、item 内如果有button等控件时,在监听listview的onitemclick事件时,焦点会被item内的button、imagebutton等控 件抢走,从而导致在listview设置了onitemclick事件后不会被触发。解决方法是在初始化item的时候屏蔽掉其内部button等控件的
2015-11-02 17:15:33
4699
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人