自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个有思想的搬运工

我浑浑噩噩,却又不甘落寞

  • 博客(174)
  • 收藏
  • 关注

原创 OpenGL 学习记录

关于 OpenGL 的学习记录

2022-09-17 17:54:29 533

原创 Kotlin Flow 相关笔记

参考文章:https://developer.android.com/kotlin/flow?hl=zh-cn涉及到的源码版本(不同版本实现可能有出入):flow() 方法以下内容,都是基于 flow() 顶级方法的内部实现是基于 SafeCollector 和 SafeFlow 来说明的。实现原理public fun <T> flow(@BuilderInference block: suspend FlowCollector<T>.() -> Unit): F

2022-01-11 00:35:08 2042

转载 About “Zero Copy“

Understanding of Netty ByteBuf’s Zero Copy (Zero Copy)

2022-01-07 11:14:21 178

原创 DialogFragment 与 android.view.WindowManager$BadTokenException

在项目中,有一个场景是某个 Activity 中会触发一个 BottomSheetDialogFragment,并在某些情况下会常驻显示不消失。然后就在线上遇到了一类 crash:android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@c7a2c02 is not valid; is your activity running?at android.view.V

2021-08-09 17:37:03 499

原创 自定义 View 实现扫描效果

演示效果如下:实现内容:控制动画是竖向或者横向控制动画初始是从底部/左边开始,或者从上边/右边开始控制动画的时常可以自定义动画素材具体实现:自定义属性:<declare-styleable name="ScanView" tools:ignore="ResourceName"> <!--扫描的图片--> <attr name="unit_scan_img" format="reference" /> <!--动画时长--

2021-04-04 17:41:40 478

原创 ViewModel 在 Activity 中的实现原理

系统源码参考自 Android API 30 Platform,以及 androidx.lifecycle:lifecycle-viewmodel:2.2.0在文章开始之前,有如下几点疑惑,先记录下来:ViewModel#onCleared() 的调用时机 ?ViewModel 与 onSaveInstanceState() 有联系吗?或者有什么区别吗?ViewModel 是否涉及序列化与反序列化?一个 Activity 中是否支持多个 ViewModel ?1. 与 ViewModel

2021-03-21 16:39:23 2304 1

原创 ViewModel 简析

1. 前述ViewModel 的作用是专门存放与界面相关的数据,分担 Activity/Fragment 的逻辑,同时会维护自己独立的生命周期。如当系统配置发生变更(如切换语言等)、横竖屏切换等,可能会导致 Activity 销毁重建,假设要被销毁是 Activity A,需要被重新创建的是 Activity B,虽然他们都属于同一类型,但是是两个不同的实例对象。因此在 Activity 销毁重建的过程中,就涉及 A 在销毁时,其内部维护的数据要过渡到重建的 B 中,这就依赖于 ViewModel。V

2021-03-21 15:13:44 7753 1

原创 Java 的 Class#isInstance() 与 instanceof

在 Java 中,有两种方式来判断某个对象是否是某一类型:Class#isInstance()instanceof两者在作用是等价的,只不过 instanceof 是 Java 的关键字,isInstance() 是 Class 的成员方法。但是在用法上,Class#isInstance() 会更加灵活一点,因为使用 instanceof 时,必须要知道具体的目标类型:obj instanceof ExactClass而 Class#isInstance() 则不必,比如:boolea

2021-03-18 21:31:08 613

原创 如何在日常工作之外给出自己的时间

回想起 20 年的八九月,被一个又一个的需求按在地上摩擦,连续好几周,每天基本上都埋在需求实现里面,两点一线,写了睡,睡了写,那时候就感觉自己是一个代码机器,没有任何时间思考,连喘口气的片段都是奢望。甚至有一次,一种强烈的呕吐感袭来,差点交代在了厕所,现在回想起来都后怕。虽然那段时间过后,好了一点,自己也克制了一点,但是还是感觉浑浑噩噩的,一直持续到这个月月初。但是从这个月月初开始,算是正式的醒悟了吧。因为我意识到,如果一心扑在所谓的需求上,不给自己留有时间与空间,来做自己的事,来让自己停下来思考,不管

2021-03-16 00:26:36 171 1

原创 折中方案实现 SimpleDraweeView 圆形头像

在使用 Fesco SimpleDraweeView 的时候,有一个需求是要在页面上展示圆形的头像,如果通过 roundAsCircle 属性来实现,可能在某些机型上出现适配的问题,如在华为 Mate P30 上,在系统设置更改字体大小,导致页面重新绘制的时候,会导致圆形头像偏移,或者发生的拉升出现十字的问题,如下图:此时虽然有另外一种实现,即使用 roundWithOverlayColor 属性,但是使用场景有局限性,即 roundWithOverlayColor 对应的颜色 C1,要与下层的 vi

2021-03-02 14:29:13 566

原创 关于 Java、Kotlin 范型与协变、逆变学习笔记

学习文章:https://rengwuxian.com/169.html笔记先定义三个类,用于辅助说明,其继承关系如下:class Grandfather {}class Father extends Grandfather {}class Son extends Father {}关于「协变」,即指的是子类的范型类型(比如 Son 是 Father 的子类,拿着子类 Son 去声明范型类型 ArrayList<Son> ),也属于范型类型的子类(即 ArrayList&lt

2021-02-25 22:02:10 117

原创 Android ConstraintLayout 设置子 view maxWidth 是父 ConstraintLayout width 的百分比

话不多说,直接上代码:<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://sc

2020-06-19 21:48:49 5154

转载 Android 编写一个简单的 gradle 插件

如何从零开发一个 gradle 插件(一)

2020-06-16 23:57:26 242

原创 Android 主动 try-catch 主线程的 Exception

android.os.Handler(android.os.Looper.getMainLooper()).post(object : Runnable { override fun run() { while (true) { try { android.os.Looper.loop() } catch (e: Throwable) { android.util.Log.

2020-05-26 20:57:01 740 2

原创 关于 Kotlin 的 ::

学习视频:https://mp.weixin.qq.com/s/SkXgevDiQF9T4kyoL4_qVg对于 Kotlin,存在一个 「函数类型」的概念,即表示某个变量类型是一个函数类型,但是要注意,函数类型并不是一个通用类型,而一个指代的名词。(a: Int)->Unit(a: Int)->String上面即对应着两种函数类型,第一个是 (a: Int)->Un...

2020-04-13 11:01:43 515

转载 【转】Java线程池实现原理及其在美团业务中的实践

传送门:https://mp.weixin.qq.com/s/baYuX8aCwQ9PP6k7TDl2Ww

2020-04-08 16:42:50 308

转载 模拟 App 在后台时,因为系统资源不足被 kill 的场景

传送门:Defending Your In-Background App When Android OS Kills It

2020-04-03 10:17:40 442

转载 CI、CD、Pipeline 概念

文章:什么是持续集成(CI)/持续部署(CD)?简要摘抄:对于 “持续” 一词的概念这并不意味着“一直在运行”,而是“随时可运行”。CI 即持续集成持续集成(continuous integration)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。CD 可分别指代两个概念:...

2020-03-22 16:34:34 7362

转载 Android 手机存储相关内容

应用操作的文件存储位置分为三个部分:1、应用内部存储私有文件目录2、应用外部存储私有文件目录3、公有目录Android手机存储分为两个部分:内部存储和外部存储,内部存储一般是手机自带的存储空间,外部存储指外插SD卡提供的存储空间;随着手机发展,这两个存储的定义又有了一些些变化,新的手机不再有外插SD卡的概念,采取了内置闪存(eMMC、UFS等)的方式,所以内部存储和外部存储在新的And...

2020-03-07 15:54:38 261

原创 关于代码编写时「抽象」概念的一点点心得

关于抽象,是面向对象的特性,之前实际写代码的时候,可能注意得不是很好,对于这个点的理解也不是很到位。但是因为公司项目涉及到了组件化,不同组件之间的通信其实是依赖抽象接口来规范的,或者说是约束的。而一开始,我在定义抽象接口的时候,就处理得不是很好,偶尔会把具体业务层的实现带到接口定义之中,虽然觉得这样有点不对劲,但是却无法参透。后来,在 code review 的时候,我的导师针对我的问题跟我...

2020-03-06 23:18:28 456

转载 私有内存、Dalvik Heap 与 《Android 性能优化&内存篇》

私有内存(Dirty and Clean)进程独占内存。也就是进程销毁时可以回收的内存容量。通常private Dirty内存是最重要的部分,因为只被自己进程使用。Dirty内存是已经被修改的内存页,因此必须常驻内存(因为没有swap);Clean内存是已经映射持久文件使用的内存页(例如正在被执行的代码),因此一段时间不使用的话就可以置换出去。实际使用内存(PSS)将跨进程共享页也加...

2020-02-03 23:45:42 915 1

原创 关于 BehaviorSubject onError() 导致的 Undeliverable exception received

RxJava 版本为 2.2.7。在做项目的时候,偶然碰到了一个关于 BehaviorSubject 的 crash,日志给的 msg 简要信息为 Undeliverable exception received。导致问题的操作是因为多次调用了 BehaviorSubject#onError()。相关的文档,以及解决方法,可以查看:https://github.com/ReactiveX/R...

2020-01-22 11:56:20 390

原创 【Kotlin】—— 函数字面值(量)补充

之前在学习 Kotlin 的时候,有整理了一篇关于 函数字面值 的博客。然后今天再回顾相关知识点的时候,感觉对这个概念加深了一点理解,而且之前那篇文章可能说得不太明白,于是这里又整理下相关的想法,做一个补充,希望能够帮助大家更加通俗的理解这个概念。首先,函数字面值(量)即一段函数文本,说白了就是一段代码,可以当作参数来传递。比如下面的:var tmp: ((Int) -> Boole...

2019-12-22 20:29:43 522

原创 关于 DialogFragment 设置成充满屏幕的处理

在做需求的时候,有要做一个 Dialog,于是我就使用了 DialogFragment 来实现的。但是在做的时候就遇到了一个问题,那就是要显示的 Dialog 的尺寸比较大,如果我直接在其引用的布局文件中的根节点设置指定的数值较大的宽高,但是实际上显示出来的尺寸并不是设置的大小,而且根节点好像没有生效,比如在根节点设置了指定的背景色,把 DialogFragment 显示出来的时候并没有达到预期...

2019-11-11 12:53:44 1165

原创 关于 Android APK 签名的文章备忘

1、APK签名机制原理详解2、Android v1、v2、v3签名详解

2019-11-11 10:47:01 158

原创 简单工厂、工厂方法、抽象工厂、Builder 模式 笔记整理

1、简单工厂模式首先,需要表明的是,简单工厂模式并不是 23 种设计模式之一。它是工厂方法模式的一个弱化版本。且简单工厂模式又称为静态工厂模式。在该模式中,一般不定义工厂抽象类,而是直接将工厂类的工厂方法改为静态方法(因此才有静态工厂你模式的说法)。静态的工厂方法可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。适用场...

2019-10-12 00:31:33 343

原创 View 工作原理笔记整理

主要摘抄自:《Android 开发艺术探索》参考文章:https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/custom_view.html1、View 的工作流程View 的工作流程主要指 measure(测量)、layout(布局)、draw(绘制)这三个流程。DecorView 作为顶级 ...

2019-09-16 23:45:19 246

原创 点击事件分发机制 关键源码笔记

请注意,涉及到的源码 SDK 版本为 27,不同版本可能存在偏差,一切以具体的源码为准。文字部分主要参考自 《Android 开发艺术探索》,源码部分的解读主要参考自 Android 触摸事件机制(四) ViewGroup中触摸事件详解,但是也加入了自己的思考。首先,需要明确的就是,同一个事件序列,就是一个连续的 ACTION_DOWN -&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; A

2019-09-09 22:47:31 7313 2

原创 热修复之类加载方案 笔记整理

热修复分为:代码修复、资源修复、动态链接修复其中,代码修复又分为:类加载方案、底层替换方案、Instant Run 方案。本篇关于代码修复的类加载方案的笔记整理。涉及源码版本为 Android 7.1.1。参考文章:1、Android热更新实现原理浅析2、《Android 进阶解密》1、理论基础类加载方案是基于 Dex 分包方案的。Dex 分包方案主要做的是在打包的时候将应用代...

2019-09-07 22:07:00 560

原创 【LeetCode】115. 不同的子序列

规定 :(1)S(0, i-1) 表示 S 的前 i 个字符组成的字符串,因此基数为 0,所以最后一个字符即第 i-1 个。(2)S[i-1] 即表示 S 的第 i-1 个字符。使用动态规划来处理,则有 dp[i][j] 代表 S(0, i-1) 与 T(0, j-1) 对应的解。对于 dp[i][j] 有:当 S[i-1] 与 T[j-1] 不相等时,则 S 的第 i-1 个字...

2019-08-28 11:54:22 244

原创 【笔记整理】Glide 4.9.0 关于数据加载之后的回调过程

当 Glide 从网络加载原始的数据的时候,会来到 HttpUrlFetcher#loadData() 方法,在 占位符 中说过,当加载完成后,会通过 callback.onDataReady() 方法将结果回传,最终会回溯到 DecodeJob#onDataFetcherReady 这个方法中,下面将会回溯的具体流程进行分析。// HttpUrlFetcher.javapublic void...

2019-08-27 08:46:29 1621

原创 【笔记整理】Glide 4.9.0 关于监听生命周期

对于 with() 方法传递的参数(包括 Activity、Fragment、View 等),如果对应的 context 为非 Application 类型的,Glide 会为作为参数传递进with() 方法的 Activity 或者 Fragment 添加一个隐藏的且隐藏的(即没有 UI 的) Fragment(SupportRequestManagerFragment 或者 RequestMa...

2019-08-27 00:57:17 993

原创 【笔记整理】Glide 4.9.0 的缓存机制

Glide 类中与内存缓存有关的变量Glide#memoryCache,如果用户没有通过 GlideBuilder#setMemoryCache(MemoryCache) 设置,则默认为 LruResourceCache(继承自 LruCache)。1. 从内存缓存读取图片资源在 Engine#load() 方法中,就先根据需要加载的资源的相关参数,来生成唯一的 key 值,而该值与从缓存机...

2019-08-27 00:54:06 1544 3

原创 【笔记整理】Glide 4.9.0 执行流程源码解析

对于源码的分析,是基于 Glide 最简单的使用的流程进行的:Glide.with(MainActivity.this).load("url of image resource").into(view);1. with() 方法with() 方法会传入当前 activity、fragment 等,目的就是为了获取对应的 context,然后根据该 context 来得到 RequestMa...

2019-08-27 00:33:35 425

原创 【LeetCode】135. 分糖果

参考链接:leetcode 135. Candy 分糖果 + 很经典的贪心算法根据题意,孩子 X 分配的糖果与第 X-1 和 X+1 个孩子的评分都有关系,即与前后孩子的评分有关系。因此可以分为两个阶段来处理。第一阶段,对于孩子 i,只去比较他与前一个孩子的比分,来确定自己需要分配的糖果数量。第二阶段,对于孩子 i,再去比较他与后一个孩子的比分,再来补充自己分配的糖果数量。public...

2019-08-26 21:09:29 189

原创 【LeetCode】134. 加油站

(注意题目给出的条件)1. 暴力破解如果对于起点 index 有 gas[index] - cost[index] < 0,则 index 肯定无法作为起点。因此肯定是从 start = x && gas[x] - cost[x] >= 0 的点开始,该点才有可能是答案。为什么说是有可能,因为还要计算该点之后的所有点是否符合要求。否则就要再换一个起点继续去...

2019-08-24 11:32:05 748

原创 【LeetCode】55. 跳跃游戏

解法 1从左到右遍历数组,假设当 index = x1 时,nums[x1] = 0,则继续向右遍历,直接遇到不为 0 的元素,假设此时 index = x2。且在遍历的时候,记录 index 在 x1 之前的元素,有 maxIndex = index+nums[index](maxIndex 表示下标为 index 对应的元素值所能跨到最远位置)。如果 maxIndex < x2,...

2019-08-22 22:45:53 174

原创 HTTPS 笔记整理

主要摘抄自:SSL/TLS 协议运行机制的概述1. 作用不使用 SSL/TLS 的 HTTP 通信,就是不加密的通信。所有信息明文传播,带来了三大风险。(1) 窃听风险(eavesdropping):第三方可以获知通信内容。(2) 篡改风险(tampering):第三方可以修改通信内容。(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。SSL/TLS 协议是为了...

2019-08-11 15:07:12 223

原创 TCP 与 UDP 笔记整理

对于 TCP 或者 UDP,需要跨越不同主机,并将数据传递到不同的进程(即应用程序)。实现主机的跨越是基于 IP,而识别进程是基于端口号。1. 连接性在网络层,无连接服务可能意味着属于同一报文的不同数据报有不同路径。在传输层,我们不关心分组的物理路径(假设两个传输层之间有一条逻辑连接)。传输层的无连接服务意味着分组之间的独立;面向连接服务意味着依赖。在无连接服务中,应用程序需要将报文...

2019-08-07 23:14:12 168

原创 TCP 笔记整理

1. TCP 首部格式1.1 序列号(Sequence Number)字段长 32 位,指发送数据的位置(序号)。每发送一次数据,就累加一次该数据 字节数 的大小。序列号初始值为建立连接时由计算机生成的随机数,通过 SYN 包传给接收端主机。此外,在建立间接时和断开连接时发送的 SYN 包和 FIN 包虽然并不携带数据,但是也会作为一个字节增加对应的序列号。1.2 确认应答号(Ackn...

2019-08-07 08:46:10 332

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除