phantomVK

Cease to struggle and you cease to live.

Java源码系列(23) -- ArrayDeque

一、类签名 ArrayDeque 是实现 Deque 接口且容量可变的双端队列数组。数组实现的双端队列没有容量限制,需要更多空间时再进行扩容。 此类线程不安全,如果没有外部同步约束,就不支持多线程并发。值得注意的是,本双端队列不接受空对象,作为栈使用时比 Stack 快,作为队列使用时比 LinkedList 快。 大多数 ArrayDeque 方法执行消耗常量时间,除了 remove...

安装Jekyll本地环境

以下环境以 Ubuntu 为例,如果环境为 Mac OS 则把 apt install 换成 brew install Jekyll 依赖 Ruby 语言,需要先安装 1 $ sudo apt install ruby 类似 pip 于 Python,RubyGems 是 Ruby 的包管理器,其终端命令为 gem。安装 Ruby 之后用 gem 直接安装 Jekyll 可能会报以下...

即时通讯的好友关系

即时通讯(Instant Messaging,下称IM),作为最符合众网民习惯的应用,见证中国乃至国际互联网的发展。IM诞生之前,中国已经经历电报、信件、寻呼机、手机短信的过程。其中电报和寻呼机几乎绝迹,个人短信的发送量也比即时通讯兴起之前锐减,但信件还在政府部门、银行、电信业发出光芒。 国内IM发展历程 早期台式机通过拨号和互联网连通,国外于1996年出现ICQ。国内也在稍晚的1997...

手写Java线程死锁

如果运行结果没有同时出现 o1没出现死锁 和 o2没出现死锁,表示两个线程已死锁 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public class DeadLockClass { public static void main(String[] args) { n...

Java动态代理

在之前空对象模式一文中,讨论约束空对象方法调用时,提到可以使用 动态代理 实现。复用前文的数据模型,现在就来实现这个方式。而动态代理的具体运行逻辑详情,将在以后文章单独进行源码剖析。 和静态代理一样,动态代理也需要把所有行为抽象化,于是把以前写在 User 的行为全部抽象到接口 IUser。 1 2 3 4 5 6 7 interface IUser{ fun getUserId...

5个线程先打印Hello再打印world

问题 5个线程打印 Hello 和 world:要求5个线程先连续打印全部 Hello,再连续打印全部 world。 实现 题目中指明5个线程合作,那么可以先让5个线程打印 Hello。线程打印完毕后就在 CyclicBarrier 实例上等待,直到 CyclicBarrier 累计线程数到达指定值,所有线程都会同时放行。放行后的线程继续打印 world 即可完成要求。 1 2 3 ...

Fragment打开页面

在 Fragment 内部调用自有方法 startActivityForResult() 1 2 3 public void startActivityForResult(Intent intent, int requestCode) { startActivityForResult(intent, requestCode, null); } 该方法辗转调用同名重载方法,方法内...

SharedPreferences与线程安全

一、前言 SharedPreferences 通过读写磁盘xml文件的方式,为客户端提供便捷的键值对持久化服务。同时支持同步和异步两种数据提交方式,减少对主线程运行的影响。 虽然此工具类因使用方便深得开发者的青睐,但其多线程操作、多进程操作是否安全的问题,却鲜有人探究。对 SharedPreferences 存取操作感兴趣的读者,这里先为您呈上文章 SharedPreferences。 ...

Android源码系列(23) -- LocalBroadcastManager

一、类签名 用于同进程本地对象注册或发送广播的帮助类。如果广播信息只需要在同进程内收发,则无需发送全局广播,仅发送本地广播即可。 同应用开启多进程不能用本地广播通讯,因为不同进程持有不同 LocalBroadcastManager 实例,每个实例间没有关联。 1 public final class LocalBroadcastManager 相比全局广播,本地广播有以下优点: ...

Android源码系列(22) -- TakeScreenshotService

上一篇文章 Android源码系列(21) – GlobalScreenshot 介绍系统是如何获取接收截图操作的通知或截取屏幕。本文作为后续文章,继续补充截图通过什么方法写入到磁盘,并通知媒体存储更新记录。 源码版本 Android28 一、SaveImageInBackgroundData 此类包含截图保存到存储所需要的数据,包括截图Bitmap、保存路径、预览图宽高等信息。 1...

Android源码系列(21) -- GlobalScreenshot

这篇文章介绍系统如何实现屏幕截取操作,并为拦截截屏事件提供思路。下篇文章 Android源码系列(22) – TakeScreenshotService 将介绍截图如何写入系统磁盘。源码版本 Android 28。 一、TakeScreenshotService TakeScreenshotService 是 Service 的子类,通过IPC的方式接受截屏请求,并通过 GlobalSc...

Glide生命周期管理

前言 图片加载时只需调用以下代码,Glide 会自动完成下载、缓存、缩放、展示等流程。 1 2 3 Glide.with(this) .load("http://www.abc.com") .into(imageView) 其中包含应用进入后台,图片会暂停加载的策略。通过这篇文章,探究 Glide 是如何实现开发者不主动触发逻辑,就能实现任务生命周期自...

Android源码系列(20) -- setContentView

本文章根据 Android 27.1.1 的 AppCompatActivity 研读,比 Activity 实现源码更复杂。 一、Activity mWindow 是 Activity 的数据成员,类型是 Window。 1 2 3 4 5 6 7 8 9 10 11 public class Activity extends ContextThemeWrappers ...

RecyclerView缓存机制

一、RecyclerView与性能 使用 RecyclerView 的难度可大可小,若仅展示单类型列表,只要优化视图绘制性能、降低布局复杂度,就能保证性能。 若列表分类多、样式差异大,类似微信聊天消息界面,遇到问题的难度将大幅增加。需要在预加载、复用上做进一步调优,单纯实现 onCreateViewHolder() 和 onBindViewHolder() 并不能满足需求。总的来说,要以...

Java源码系列(22) -- ArrayBlockingQueue

一、类签名 ArrayBlockingQueue 为有界数组。队列元素顺序为先进先出。队头指针元素在队列内保存时间最长,队尾指针元素在队列内保存时间最短。新元素插入到队尾,而遍历操作则从队头获取元素。 1 2 public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements...