phantomVK

Cease to struggle and you cease to live.

Java源码系列(23) -- ArrayDeque

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

即时通讯的好友关系

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

手写Java线程阻塞

如果运行结果没有同时出现 o1没出现死锁 和 o2没出现死锁,表示两个线程已死锁 public class DeadLockClass { public static void main(String[] args) { Thread t1 = new Thread(new DeadLock(true)); Thread t2 = new Threa...

Java动态代理

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

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

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

Fragment.startActivityForResult逻辑

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

SharedPreferences与线程安全

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

Android源码系列(23) -- LocalBroadcastManager

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

Android源码系列(22) -- TakeScreenshotService

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

Android源码系列(21) -- GlobalScreenshot

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

Glide生命周期管理

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

Android源码系列(20) -- setContentView

一、Activity mWindow 是 Activity 的数据成员,源码来自 Android 27.1.1 public class Activity extends ContextThemeWrappers implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, ...

RecyclerView缓存机制

一、RecyclerView与性能 使用 RecyclerView 的难度可大可小。仅作为单一类型列表展示,只要对视图布局进行优化,减低层次复杂度,几乎不可能存在性能问题。 若列表分类多、样式差异大,类似微信聊天消息界面,问题的难度提升不少。需要在预加载、复用上做进一步调优,单纯实现 onCreateViewHolder() 和 onBindViewHolder() 并不能满足需求。总的...

Java源码系列(22) -- ArrayBlockingQueue

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

Glide -- ResourceTranscoder

源码版本 Glide 4.8.0 ResourceTranscoder ResourceTranscoder 是 Glide 内类型转换器的抽象接口,表示资源从一种类型转换为另一种类型。泛型 Z 表示转换前资源的原始类型,泛型 R 表示资源转换后的目标类型。 public interface ResourceTranscoder<Z, R> { // 子类实现此方法,...