phantomVK

Cease to struggle and you cease to live.

EventBus源码剖析(1) -- 订阅注册与注销

一、简介 1.1 特性 EventBus 是为 Android 而设,处于中心的 publish/subscribe (发布/订阅) 事件系统。事件通过 post(Object) 提交到总线,总线把事件投递给订阅者。而该订阅者需含有匹配类型消息的处理方法。 为了能接收事件,订阅者需通过 register(Object) 把自己注册到事件总线上。一旦成功注册,订阅者可以持续接收关心的...

Java源码系列(20) -- Runnable & Callable

Runnable Runnable 接口由需被线程执行的类继承实现,实现类需实现接口中无参数的方法 run。 此接口为那些希望在激活时执行代码的对象提供公共协议。例如 Thread 实现 Runnable 接口,当 Thread 激活之后表示线程已经启动且尚未停止。 @FunctionalInterface public interface Runnable { // 当对象实...

Java源码系列(19) -- LinkedBlockingDeque

一、类签名 本类是基于链节点的、可选边界的阻塞双端队列。指定可选的容量避免队列过度扩展。 public class LinkedBlockingDeque<E> extends AbstractQueue<E> implements BlockingDeque<E>, java.io.Serializable 如果构造方法的容量参数...

Android源码系列(17) -- QueuedWork

一、类签名 这是个内部工具类,用于跟踪那些未完成的或尚未结束的全局任务,新任务通过方法 queue 加入。添加 finisher 的runnables,由 waitToFinish 方法保证执行,用于保证任务已被处理完成。 这个类用于 SharedPreference 编辑后修改异步写入到磁盘,所以设计一个在 Activity.onPause 或类似地方等待写入操作机制,而这个机制也能用...

Android源码系列(16) -- MessageQueue

一、类签名 MessageQueue 是个低层次类,持有需要分发的消息。而消息并不是直接存入 MessageQueue,而是通过 Looper 相对应 Handler 加入。通过方法 Looper.myQueue() 可以获取当前线程 MessageQueue。 public final class MessageQueue MessageQueue、Looper 和 Thread ...

Java源码系列(18) -- RejectedExecutionHandlers及子类

一、基类 RejectedExecutionHandler 所有拒绝策略都需要继承此类,用于处理被 ThreadPoolExecutor 拒绝的任务 public interface RejectedExecutionHandler { // ThreadPoolExecutor.execute拒绝执行任务后,此方法由ThreadPoolExecutor调用 ...

Android源码系列(15) -- AsyncTask

一、类签名 1.1 作用 AsyncTask令主线程的正确使用变得简单。无需维护线程或 Handler ,即能让任务在后台线程运算,并把结果提交到主线程。 public abstract class AsyncTask<Params, Progress, Result> AsyncTask设计为围绕着 Thread 和 Handler,且无需构造普通线程框架的帮助类。适...

Android源码系列(14) -- IntentService

一、类签名 IntentService 是异步处理 Intent 的 Service 抽象子类。客户端通过 startService(Intent) 发送请求,服务根据需要启动,轮流处理收到的 Intent ,所有任务处理完后服务自行结束。 public abstract class IntentService extends Service 这种 “工作队列处理器” 模式主要适用于...

Android布局截取

布局 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" ...

自定义DialogFragment宽度

一、现象 DialogFragment的xml布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/too...

仿Android微信消息气泡

一、前言 在网上搜索相关主题,会发现千篇一律地使用9-Patch图片作为TextView背景,效果不好不说,还存在不少问题。 9-Patch本质是用图片作为背景,只是这张图片在设置的某些像素点上重复绘制达到拉伸效果。因为Android屏幕碎片化原因,所以一张9-Patch不能适配所有屏幕,至少需要分别适配 xhdpi 和 xxhdpi。 虽然每张9-Patch体积不大,但扩展到 不同场...

Android源码系列(13) -- ArrayMap

一、类签名 ArrayMap 是通用的键值对映射数据结构,相比 HashMap 有更高内存利用率。因为 ArrayMap 使用数组结构保存映射:一个整形数组存放哈希值,一个 Object 数组存放 Key 和 Value。 使用数组能避免为每个放入 Map 的entry创建额外对象(对比HashMap#Node),并能更有力地控制数组扩展的大小。 public final class ...

Android源码系列(12) -- SharedPreferences

一、概述 1.1 简介 1.2 用法 首先获取 SharedPreferences 实例,调用 sp.edit() 获得可编辑实例,写入数据并提交。 SharedPreferences sp = getSharedPreferences("PrefsName", MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); ...

Android Studio不断indexing

自从 Android Studio 3.0 升级到 Android Studio 3.1.3 后,每次打开工程持续不断indexing,一秒钟会indexing好几次,且一直持续不终止。这个问题直接影响到开发速度:因为indexing过程中,编辑代码的代码提示不出现,自动代码检查运行不正常,更不说编译运行。 开始还以为是 Android Studio 3.1.3 存在bug,但是升级到 A...

Java源码系列(17) -- LinkedBlockingQueue

一、类签名 从类名可知,LinkedBlockingQueue是基于链表实现的阻塞队列。 public class LinkedBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable 类特点: 基于...