- 博客(33)
- 资源 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 Android ThreadPoolExecutor 底层原理分析
前言在Java语言中线程池是一个非常有用的Api同时也是一个非常有意思的设计,随着搬砖的时间的积累以及头发的变少慢慢的也对各种源代码也越来越感兴趣了。之前也看过网上很多对线程分析和讲解的文章,但是总是记不住他们到底讲了什么,真正等到来用的时候又忘记了,其实只有我们真正的钻入到代码以后才能真正的理解,然后再加以用我们生活的一些例子来对里面的术语进行形象化。池化技术程序的运行,其本质上是对系统...
2020-04-13 15:56:23
366
原创 深入理解System.arraycopy内部原理
深入理解System.arraycopy内部原理 以前面试的时候总会被人问起一些Java里面的很多的东西,比如说ArrayList和Vector内部是如何实现当时我心里就一万个的草泥马,平时我们都不是只管用吗,只要会去使用就行了,管它其他的什么乱七八糟的。后来被人问多了就会慢慢的带着好奇心去看了。下面我就以android-19的api来进行分析,因为Android大部分的源代码都已经开源了而且都比较完善的,可以直接还可以看到jni层的代
2021-01-10 23:11:38
2473
1
原创 Android HandlerThread 分析
前言在上一篇文章中我们对Handler、Looper、MessageQueue的内部实现原理以及实现。我们大部分的时候都是将消息从子线程发送到主线程来进行处理。就是说 Handler的 handleMessage 方法是在主线程中执行。下面我将介绍的这个类则完全相反:在主线程发送消息但是在子线程里面处理消息,也就是说 handleMessage 是在子线程中执行的,这个时候我们就不能在这个方法执行 UI的更新操作了。示例代码public class MainActivity extends AppCo
2020-07-07 18:08:12
238
原创 Android Handler、Looper、MessageQueue分析
前言最近在面试的时候总是被问题Handler、Looper这几者之间的关系,其实自己本来就已经烂熟于心的了,问多了问的特别的烦,于是乎就把这篇总结在搬上来翻炒一下吧。其实这个类是一个非常重要的类,因为我们需要在异步线程里面更新界面操作的话都是需要用到这个类的;还有一个目的是为我后面分析HandlerThread、IntentService、BlockCanary框架做铺垫。使用示例public class MainActivity extends AppCompatActivity {
2020-07-05 20:33:16
323
原创 深入分析 ViewStub 原理
前言最近在面试的时候被面试官问到ViewStub内部是如何使用占位的时候,我是一脸懵逼,说实话我之前对UI上的一些控件内部的代码看的非常少,所以一时答不上来,这个东西其实并不说有多难,而是我们平时在开发的过程中只是简单的去调用了一下但是并没有深入的去了解其内部的原理。其实面试的过程就是我们一个查漏补缺的过程中,让我们的各个知识面都更加的能提高,同时做到知其然更知其所以然。介绍平时我们在开发Android的界面的时候,如果遇到不需要显示的控件或者是布局的时候挺通常我们都会将其设置为View.Gone或者
2020-06-21 13:05:16
993
原创 Android CopyOnWriteArrayList 分析
说明CopyOnWrite容器我们可以理解为写的时候复制的容器,最简单的理解就是当我们往里面添加元素的时候,不直接往当前的容易添加,而是先将当前容易拷贝一份,复制成一个新的容器,然后在新的容器里添加元素,添加完元素以后,再将原容器的引用指向新的容器。这样子我们就非常轻松的实现了读写分离的操作。从单词的后半部分来看其内部存储跟ArrayList都是使用了数组进行数据存储的,而且添加、修改、删除、查询数据的方法名字都是一样的。类结构图源码分析主要属性//这个变量主要是用于同步代码加锁使用 syn
2020-05-31 14:43:34
822
1
原创 Android PriorityQueue 分析
前言我们之前之前接触过很多数据结构,比如数组、栈、红黑树,队列,链表,二叉树等等。我们都知道队列是一种遵循先进先出(First-In-First-Out)的模式,但在有的时候我们需要在队列中基于优先级处理对象的。比如说下面几种情况:作业系统中的调度程序,当一个作业完成后需要从所有等待调度的作业选择一个优先级最高的来执行,并且也可以添加一个新的作业到优先队列中Timer定时任务中我们需要获取...
2020-04-19 18:42:52
454
原创 Android HttpUrlConnection 分析
前言在Java中我们经常使用HttpUrlConnection来做http网络请求,使用HttpsUrlConnection来做https网络请求的,但是在Android中我们还是可以使用阿帕奇开源框架 HttpClient来进行网络请求(Android6.0及以上废弃了),Android6.0及以上使用都是OKHttp和HttpUrConnection,我们发现很多所谓的网络请求框架都是基于上...
2020-04-13 16:38:22
298
原创 Android BufferInputStream 和 BufferOutputStream 分析
前言在上篇文章中我们深入的分析File Stream的读写文件的原理:通过 JNI 调用 C语言的文件操作接口,然后调用操作系统的接口去操作文件。流的操作的特性就是数据传输(一直前进,而不能往后退),在数据传输速度和处理的速度存在不平衡的,这种不平衡使得数据传输过程中进行缓存处理而释放数据处理器的资源是一种提高程序效率的机制。举个特别简单的例子,平时抽水马桶上方水槽的水是一点点积累的,如果水未积...
2020-04-13 16:35:15
962
原创 Android FileInputStream 和FileOutputStream 分析
简介Java中针对文件的读写操作设置了一系列的流,其中主要有FileInputStream,FileOutputStream,FileReader,FileWriter四种最为常用的流。其余流操作类的都是对这四种流的一种包装了。其实严格意义来说的话FileWrite和FileReader其实也是对FileOutputStream和FileInputStream的一种包装的,都是通过对字节流的处理...
2020-04-13 16:02:47
4361
原创 Android Timer和TimerTask源码分析
Android平台中有许多的定时器比如说CountDownTimer和Timer,定时器就像平时使用的定时闹钟一样,在固定的时候就会执行某种任务,也在可以反复的做某种事情。其中Timer是Java老牌的定时器平时我们估计用的特别多,但是对于其内部的实现却知之甚少的。基本使用mTimer = new Timer();mTimerTask = new TimerTask() { @Ove...
2020-04-13 15:51:43
446
原创 Android ArrayDeque 分析
简介ArrayDeque是JDK容器中的一个双端队列实现,不过它内部使用的是数组来对元素进行操作,不允许存储null值,同时可以当做队列,双端队列,栈来进行使用。上篇文章的时候我们分析过LinkedList也是双端队列,不过用的是双向链表结构实现的。使用示例public static void main(String[] args) { ArrayDeque<String>...
2020-04-13 15:46:13
814
原创 Android LinkedList 分析
简介LinkedList是Collection下的一个list实现,它是一个以双向链表实现的List,除了作为List使用,还可以当做队列和栈来使用,下面我们就来看看具体的实现细节。继承关系图通过上面的继承关系图,我们知道它实现了List接口,还实现了Queue和Deque接口,所以还能作为双端队列进行使用,最后还实现了Serializable 接口,说明也是可序列化的。源代码分析模...
2020-04-13 15:42:08
720
原创 Android ArrayList 分析
简介在Java的集合中,ArrayList可以说是用的最频繁的一个,List是一个有序,可重复的集合,但是它确是线程不安全的,我么还可以通过索引来访问指定位置的集合元素。虽然我们平时经常的使用它但是对于它的底层的代码实现我们却一直没有怎么关注。算法速读法类结构图代码实现我们一般都是两种构造方法来创建ArrayList的。//数组中真实存储数据的长度int size;//用于存储数...
2020-04-13 15:36:16
2486
原创 Android LockSupport 分析
我们以前在对线程进行阻塞与唤醒的时候经常会使用Object类中的wait()和notify(),其实除了这个方式之外,Java中还提供了另外一种的方式来对线程进行挂起和恢复:LockSupport。案例演示 该类中有两个非常核心的方法park()和unpark()方法分别用于对线程进行挂起和恢复的操作,我们知道如果对线程进行了挂起的操作的话,则当前线程处于等待的状态。下面我们来模拟一下:当
2017-10-19 20:17:55
781
原创 Android 深入了解相册内部 二
通过上篇博客我们知道了是系统对外暴露出来的ContentProvider来获取数据库中的图片信息的,使我们知道了如何去实现一个简单的相册了,而不是仅仅去跳转到系统中去做处理了,这么方便的操作极大的满足了我们平常的开发的一些特殊的需求。但是我们在实现完成功能之后我们更多的是要去了解其内部的原理以及是如何运行操作的这样子才能更好的有助于我们水平的提高,同时阅读别人优秀的代码也是对自己的一种提高。
2017-08-29 21:22:23
624
原创 Android 开启手电筒功能(完美适配4.x, 5.x, 6.x )
最近在逛GooglePlay应用市场的时候发现很多的手电筒功能居然都带有广告感觉非常的不可思议的。而且这些应用不仅仅有广告而且安装包还特别的大,我本来还想下载一个来玩玩的,后来看了他们的东西感觉也不过如此的。主要功能还是打开手电筒的功能,有没有其他的新颖的地方了,为了能让大家更好的有一个属于的自己的手电筒功能,这里我将整理一个比较完美适配各个机型的手电筒出来。 在着手准备开发的时候我们更多
2017-08-24 21:57:54
4391
2
原创 Android 深入了解相册内部 一
之前在工作项目的时候遇到过要获取手机上所有图片信息的需求,也就是要在自己应用内部做一个图片选择器的功能,当产品提出这个问题的时候我当时的想法就很怀疑这个需要合理,后来我就在github上搜索到了一个挺好的图片选择的库:https://github.com/learnNcode/MediaChooser,后来集成到项目中的时候发现居然系统的相册的功能差不多的,都可以扫描出手机上的图片,而且毫无遗漏的。
2017-08-09 17:32:06
502
原创 Android ActivityLifecycleCallbacks 分析
最近产品有个需求就是需要统计前台页面的停留时间,用我们程序员的话来说就是统计Activity在前台的时间,也就是如果程序从启动开始到按home键切换到后台的时候的这段时间内。之前还不知道 ActivityLifecycleCallbacks的时候我就写了一个BaseActivity,然后所有的Activity都去继承该类。但是如果后期项目都已经做好了的话,那在统计的时候就有可能会出现统计不完整的情况
2017-07-07 17:31:28
1651
原创 Android SparseArray 分析
我们平时在Android平台上开发应用的时候经常会使用Java中的api去处理一些东西,但是由于Android手机的内存,cpu的处理能力等等原因,java上的api可能会处理同一个问题上可能会需要 更多的内存空间去完成。于是Android上就推出了一些自己的api去优化这些问题,比如说本章的SparseArray。 官方文档是这么介绍的: SparseArrays map integers
2017-06-30 16:08:00
1616
原创 Android Unsafe 分析
前两天在看Android平台上的FutureTask类的时候无意看到了Unsafe,当时这个类是报红色的属于sun.* API肿的类,并且不是J2SE中真正的一部分,因为你很有可能找不到任何的官方信息,但是你可以在Android源代码中可以找到该代码的实现以及 Native的实现,这个有利于我们的学习和使用。该类在Android4.4系统的Art虚拟机和Davilk虚拟中的代码中,其路径分别为: 1
2017-06-16 16:09:39
3803
2
原创 Android FutureTask 分析
之前在研究AsyncTask源代码的时候发现了它的内部使用了FutureTask、Future,Callable类来实现,因为之前在学习java的时候并没有接触到这些东西,于是乎就打开了百度看了半天别人的博客也没有理解其用法以及原理,后来果断的查看了一下其源代码之后才知道其来龙去脉。官方文档这么介绍FutureTask类的。A cancellable asynchronous computation
2017-06-08 17:28:19
5312
1
原创 Android CountDownTimer 分析
有时候我们在一些特别的场景可能会需要使用到不是这么精确的倒计时的功能,比如说:发送短信验证码倒计时。有时候我们会发现这个功能也不难但是实现起来的话也挺繁琐的,这个时候系统Api就为我们简化代码封装了一个CountDownTimer的类来使用。我们平时在做这类需求的时候可能很多都会使用Thread+Handler或者是Timer + handler机制,一个简单的功能写了一大片的代码来实现,下面我们就
2017-06-05 16:31:22
2236
原创 Android AsynTask 分析
本次我们将来介绍一下Android的异步任务类AsynTask,相信大家平时在开发的时候经常使用。一般我们在做一些比较耗时的操作任务都会开启一个线程去执行任务,因为这样子不会阻塞UI线程,用户操作起来界面的时候才不会卡顿的,大大的增加了用户体验的,但是懒惰的工程师经常嫌弃开启一个线程在更新UI界面的时候还需要再使用Handler。这样子就可能会使得代码不美观。使用说明具体的使用我这里就不详细的写de
2017-05-25 16:53:05
430
原创 Android SharedPreferences 分析
我们平时在项目里保存数据的时候经常使用SharedPreferences来保存数据,比如说什么第一次启动的数据,还有一些比较轻量级的数据保存都保存在这个里面。我们平时不管是在子线程还是主线程中都可以使用这个类来获取数据和更新数据而且也没有烦人的多线程问题。使用方法存数据的两种方法:commit 和 applySharedPreferences sp = getSharedPreferences(
2017-05-19 19:04:51
639
原创 Lottie动画学习一 —— 入门博客介绍
Lottie是什么?今天接手一个新项目的时候发现以前的同事引入了Lottie库,因为之前没有接触过后来百度了一下发现原来这个库主要是用来实现一些比较复杂的动画的。下面是官方的介绍,Lottie是Airbnb开源的一个支持Android、ios以及ReactNative,利用json文件的方式快速的实现动画效果的库,接下来就介绍一下它的如何使用的。最开始我们就去github上看看它的源代码以及Demo
2017-04-28 23:59:50
5871
原创 ViewPager 嵌套ViewPager来搭建首页
我们平时在搭建项目的主页的时候,经常会使用Fragment+FragmentPagerAdapter来搭建,然后通过继承FragmentActivity来实现,但是有时候我们可能遇到首页可能是一个滑动的页面,然后每个页面中有需要嵌套多个页面,而且更变态的时候嵌套的页面中还需要滑动,这个时候我们想是不是可以使用ViewPager嵌套ViewPager呢? 但是实践之后我们发现ViewPager嵌套Vi
2016-01-05 12:37:29
866
原创 仿京东顶部加载动画
昨天的时候我们仿照了一个美团的加载的图标的小人,今天我们也来看看京东在下拉刷新的时候也会有一个快递的小人是怎么实现的,还是依靠惯例,我们解压一下它的apk,然后去里面找一找那些素材,发现原来也有几张图片,原来它的原理是和美团是一样的,其他的就不多说了。 我们先把素材取出来再说: 接下来我们就在drawable 目录下新建一个 loading_jd.xml 文件<?xml
2015-11-21 14:35:49
3054
3
原创 仿美团加载动画效果
这两天在用美团的时候,平时中没有注意的一个小细节,今天注意到了,就是在进入新页面还没有加载数据的时候,我们都可以看到一个小人像是在跑步,于是我非常好奇这个东西是怎么做的呢?于是乎我就把它的apk下载下来,然后解压之后,看到了 drawable-xxhdpi-v4 目录下有4张类似跑步的图片;发现原来它是用了 Android动画中的帧动画来实现的。下面我们也来实现一个这样子的效果吧。 第一步我们把这
2015-11-20 23:06:15
4259
原创 Java HMAC-SHA1加密算法的实现
**摘 要:**HMAC-SHA1是一种安全的基于加密 hash函数和共享密钥的消息认证协议,它可以有效地防止数据在传输的过程中被截取和篡改,维护了数据的完整性、可靠性和安全性。HMAC-SHA1消息认证机制的成功在于一个加密的 hash函数、一个加密的随机密钥和一个安全的密钥交换机制。本博客目前不涉及其加密的数学知识,也不涉及到其中的加密原理,只是实现了Java语言实现加密的方式。随着以后知识的
2015-11-15 11:42:35
24651
3
原创 Java MD5加密算法的实现
前 言:在我们日常的编程中,md5加密算法是用的比较多的一种加密方式,一个加密内容只能生成一个加密后的内容,而且还不能进行解密的;所以在日常的生活中用于生成一些本地图片的路径或者是需要生成唯一的字符串的时候,我们都会用到该加密算法。MD5加密算法可以分为16位加密和32加密的,其实所谓的16位的加密算法只是在32位的加密算法中截取了第8位到第24位字符串,总共16位的字符串,故而叫做是16位的MD5
2015-11-14 18:58:18
3935
原创 Java HMACShA256
HMacSHA256加密算法的实现 由于是第一次上写博客,所以我先上代码,具体的原理和一些理论知识也没有具体,以后慢慢的补上;以前的时候只接触过MD5算法的,现在我就来把Java中的一些常用的算法来总结一下,下面也介绍的是HMACSHA25算法Java代码:加密算法的核心代码: public static String HMACSHA256(byte[] data, byte[] key)
2015-11-14 17:48:14
29153
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人