phantomVK

Cease to struggle and you cease to live.

手写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) – S...

Android源码系列(23) -- LocalBroadcastManager

一、类签名 用于同进程本地对象注册或发送广播的帮助类。如果广播信息只需要在同进程内收发,则无需发送全局广播,仅发送本地广播即可。同一应用开启多进程,不能在不同进程间用本地广播进行通讯,因为不同进程持有不同 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

本文章根据 Android 27.1.1 的 AppCompatActivity 研读,比 Activity 实现源码更复杂。 一、Activity mWindow 是 Activity 的数据成员,类型是 Window。 public class Activity extends ContextThemeWrappers implements LayoutInflat...

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> { // 子类实现此方法,...

Dart配置运行

简介 相比 Java、Kotlin、Go 或 JavaScript,Dart 在开发语言中小众且冷门。而人们对 Dart 的关注度逐渐提升是因为 Flutter 的日渐兴起,其主要编程语言正是 Dart。Dart 和 Go 都是谷歌亲儿子,我个人短时间所产生的熟悉感,来自 Dart 的语法和 Kotlin 高度相像。两者都是面向对象、单继承、强类型且支持自动类型推断的语言。 现时 Dar...

禁止Windows10自动安装驱动

操作步骤: 1、右键开始菜单,选择 “运行” ,输入命令 “gpedit.msc” 并确定; 2、弹出本地组策略编辑器,按照下图路径展开: 3、进入 “Windows更新不包括驱动程序” 选项。双击打开,修改为已启动并确定即可。