OOFTF Blog

「美好的事情即将发生」

[置顶] StaggeredGridLayoutManager

StaggeredGridLayoutManager 瀑布流头部空白和 item 漂移问题 什么情况下会出现漂移问题 如果当前布局情况如图所示左上角出现了一片空白区域,StaggeredGridLayoutManager 会根据当前的 GapStrategy 采取不同的方式调整布局,就会出现漂移 GapStrategy 默认为 GAP_HANDLING_MOVE_ITEMS...

[置顶] View触摸事件分发

触摸事件是从哪里来的 InputEventReceiver.dispatchInputEvent ViewRootImpl$WindowInputEventReceiver.onInputEvent ViewRootImpl.enqueueInputEvent … ViewRootImpl$ViewPostImeInputStage.processPointerEven...

[置顶] LeakCanary

LeakCanary 使用 1 2 3 4 dependencies { // debugImplementation because LeakCanary should only run in debug builds. debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' } LeakCan...

[置顶] LiveData

LiveData 原理分析 LiveData.post() 1 2 3 4 5 6 7 8 9 10 11 protected void postValue(T value) { boolean postTask; synchronized (mDataLock) { postTask = mPendingData == NOT_SET;//判断是否需要发送更...

[置顶] Java内存模型

Java内存模型(Java Memory Model,JMM) JMM的由来 由于计算机的储存设备与处理器的运算速度有着几个数量级的差距,所以现代计算机系统都不得不加入一层或多层读写速度尽可能接近处理器运算速度的的高速缓存(Cache)来作为内存与处理器之间的的缓冲:将运算所需要的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写 ...

[置顶] Activity

Activity 关于Application.activityLifecycleCallbacks.onCreate Lifecycle.onCreate 和 MyAcitivity.onCreate 的调用顺序 查看 Activity.performCreate 方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 final void perfo...

[置顶] Glide

Glide 特性 Glide 可以自动帮助你处理片状网络连接:它可以监听用户的连接状态并在用户重新连接到网络时重启之前失败的请求。如果 Glide 检测到你的应用拥有 ACCESS_NETWORK_STATE 权限,Glide 将自动监听连接状态而不需要额外的改动。 Glide 可以自动帮你处理 Activity 或者 Fragment 的声明周期,当 Activity 和 Fr...

[置顶] ViewModel

项目配置ViewModel支持 1 2 def lifecycle_version = "2.3.1" implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" 如果要使用 ViewModelScope 需要添加 1 implementation 'androidx.li...

[置顶] Gc

GC 从回收内存的角度看,由于现代垃圾收集器大部分都是基于分代收集理论设计的,所以Java堆中经常会出现“新生代”“老年代”“永久代”“Eden空间”“From Survivor空间”“To Survivor空间”等名词,这些区域划分仅仅是一部分垃圾收集器的共同特性或者说设计风格而已,而非某个Java虚拟机具体实现的固有内存布局,更不是《Java虚拟机规范》里对Java堆的进一步细致划分 不...

[置顶] Okhttp

Okhttp 网络请求流程 (4.9.0) 1 OkHttpClient.Builder().build().newCall(Request.Builder().build()).execute() 构建HttpClient 配置拦截器 设置超时时间 设置SSL认证 设置Dispatcher调度器 重试 ...

[置顶] Kotlin

kotlin关键字 abstract 抽象声明,被标注对象默认是open annotation 注解声明 by 类委托、属性委托 class 声明类 companion 伴生对象声明 const 声明编译期常量 constructor 声明构造函数 data 数据类,声明的类默认实现equals()/hashCode()/toString/copy()/co...

[置顶] Memory Optimization

内存优化 误区:内存占用的越少越好 内存不足常常会引起一些崩溃问题,有些同学就会认为内存占用的越少性能越好,导致优化内存过程中“用力过猛” 应用是否占用了过多的内存,和系统和设备当时的情况有关,而不是一个绝对数值。当系统内存充足时,我们可以占用多用一些获得更好的的性能。当系统内存不足是,希望可以做到“用时分配,及时释放”, 能够迅速释放各种缓存减少系统的压力 采用设备分级机制 判断手机...

[置顶] Boot Optimization

启动过程 如图所示 T1 预览窗口显示。系统在拉起进程之前,会先根据Application的 Theme 属性创建预览窗口。当然如果我们禁用预览窗口或者将预览窗口指定为透明, 用户在这段时间依然看到的是桌面。 T2 闪屏显示。在进程和闪屏窗口页面创建完毕,并且完成一系列 inflate view、onmeasure、onlayout 等准备工作后,用户终于可以看到启动Acti...

[置顶] Android Version Changes

版本变化 KitKat Android 4.4 全屏沉浸模式 用于动画场景的转场框架 透明系统 UI 样式 新的 Chromium WebView 采用更新版本的 JavaScript引擎 (V8),支持使用 Chrome DevTools进行远程调试 Android 4.4 中已引入处于实验阶段的 ART 运行时 Lollipop Android 5.0 API ...

[置顶] Java内存

内存 内存模型(JMM) Java内存空间 相关文章 https://blog.csdn.net/laomo_bible/article/details/83067810 https://blog.csdn.net/singwhatiwanna/article/details/111713858?spm=1001.2014.3001.5501 但类似于 “基本变量++” / “vol...

[置顶] 设计模式

精选文章 runoob-设计模式 设计模式在软件开发中的两个主要用途。 开发人员的共同平台 设计模式提供了一个标准的术语系统,且具体到特定的情景。例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计模式的开发人员都能使用单个对象,并且可以通过这种方式告诉对方,程序使用的是单例模式。 最佳的实践 设计模式已经经历了很长一段时间的发展,它们提供了软件开发过程中面临的一般问题的最...

[置顶] 自定义view

View View的移动 不改变布局参数(不会触发layout) scrollTo 传统动画和属性动画(translationX translationY) 改变布局参数(改变LayoutParams) 平滑滑动动画 Scroller ObjectAnimator View 的四个构造函数 1. 一个参数构造函数 ...

[置顶] 网络

网络 运输层 传输控制协议(TCP,Transmission Control Protocol) 用户数据报协议(UDP,User Datagram Protocol) TCP和UDP协议有什么不同 TCP是可靠的,有序的,面向链接的,传输数据较大,速度慢,具有数据重传机制, UDP是不可靠的,无序的,没有链接的,传输数据小,速度快, TCP一般用在文件传输,邮件...

[置顶] Handler

运行机制包括 Handler 消息处理 持有 Looper、MessageQueue 对象 Message 消息实体,用于存放需要处理的数据 持有 Handler 对象 MessageQueue 消息队列 持有 Message 已经发送的消息,存放在 MessageQueue 这个消息队列上,等在 Looper 取出 Looper 消息循环体 持有 MeeageQueue ...

[置顶] Git

操作 Git global setup git config --global user.name "lihang36" git config --global user.email "lihang9@jd.com" SSH GIT SSH GITHUB SSH 一般git操作 从服务端拉取代码(Create a new repository) git clone http://git.j...

[置顶] Aop

AOP(面向切面编程)方案 AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 主要用途 日志记录,性能统计,安全控制,事务处理,异常处理等等。 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变 这些行为的时候...

Textview

setCompoundDrawables 和 setCompoundDrawablesWithIntrinsicBounds 有什么区别 1 2 Drawable leftIcon = ContextCompat.getDrawable(this, R.drawable.elder_right_icon); text.setCompoundDrawables...

Alice键盘

Alice Owlab Spring QQ群 739562628 介绍 bear65 v2 青丘 QQ群 167891869 亚克力

多线程问题实操

List 多线程问题 1 2 3 4 5 6 7 8 9 10 11 12 ArrayList<String> data = new ArrayList<>(); for (int i = 0; i < 100; i++) { int finalI = i; new Thread((...

倒计时

CountDownTimer\ 用法 1 2 3 4 5 6 val cdt = object:CountDownTimer(10000,1000){ override fun onTick(millisUntilFinished: Long) {} override fun onFinish() {} } cdt.start() ...

错题集

错题集 有关于数据流的操作一定要记得调用 close、destory 等方法,并且要在 finally 中调用。 记得检查一遍需不需要做混淆配置。

键盘套件

键盘套件 Infinity 81(亚克力、gasket) buff v2 67 (铝壳、gasket)(1300元左右) QQ群号:917393177 这种铝壳很容易掉色,一定要注意 腹灵 mk870 老薛 980 淘宝搜索店铺: “下次一定工作室” Sci68 Elite (489元) 外壳 PC材质 ...

Plantuml

安装 PlantUML mac 1. Android studio 安装 PlantUML integration 插件 2. 系统安装 graphviz brew install graphviz 3. 查找路径 输入 dot -version 会显示 graphviz 路径 libdir = “/opt/homebrew/Cellar/graphviz/2.49.0/lib/grap...

Nestedscroll

NesedScroll 和 传统触摸事件分发处理有什么优势? 对滑动方向、fling、滑动距离、做了封装,处理起来更加方便。每个方法都有明确的意义 传统事件分发,在处理 “一个触摸循环” 两个控件分别处理一部分事件时,非常难处理。而 NestedScroll 比较好处理。 方法交互流程图 文章推荐 Android NestedScrolling全面解析 Ne...

Vue响应式原理

Vue 响应式原理 如何追踪变化 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty (Object.defineProperty 是 ES5 中一个无法 shim 的特性)把这些 property 全部转为 getter/setter。这些 getter/set...

Less

Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言。Less 仅对 CSS 语言增加了少许方便的扩展。 Less 到底为 CSS 添加了什么功能?以下就是这些新加功能的概览。 变量(Variables) 无需多说,看代码一目了然: @width: 10px; @height: @width + 10px; #header { wid...

Homebrew

Homebrew 安装 homebrew 命令 1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装 homebrew 错误 1 curl: (7) Failed to connect to raw.githubusercontent....

Mac配置环境变量

查看 Shell 终端是 bash 还是 zsh 查看 shell 1 echo $SHELL 如果显示 /bin/zsh 表示使用的 zsh shell 如果显示 /bin/bash 表示使用的 zsh shell 查看所有 shell 1 cat /etc/shells 切换 shell shell 切换成 bash 1 chsh -s /bin/bash shell 切换...

动画

动画 view 的动画能超过父View 的大小吗 无论是 Animator 还是 Animation 都无法超过父 View 的大小 动画 会引起 onLayoutChange 吗 不会 动画 是什么时候开始播放的? view.postOnAnimation(); 中执行的 ...

Kotlin 协程

coroutines 官方描述:协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。 协程很重要的一点就是当它挂起的时候,它不会阻塞其他线程。协程底层库也是异步处理阻塞任务,但是这些复杂的操作被底层库封装起...

Kotlin Flow

Flow Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库,也叫做异步流,类似 RxJava 的 Observable 、 Flowable 等等 在 MVVM 架构中使用 Kotlin Flow 冷流和热流 冷流 :只有订阅者订阅时,才开始执行发射数据流的代码。并且冷流和订阅者只能是一对一的关系,当有多个不同的订阅者时,消息是重新完整...

网络优化

1. DNS优化 DNS 解析,默认使用运行商的 LocalDNS 服务,DNS 完整的解析流程很长,会先从本地系统缓存取,若没有就到最近的 DNS 服务器取,若没有再到主域名服 务器取,每一层都有缓存,但为了域名解析的实时性,每一层缓存都有过期时间。 传统的DNS解析机制有几个缺点: 缓存时间设置得长,域名更新不及时,设置得短,大量 DNS 解析请求影响请求速度; 域名劫持,...

RxJava 源码分析

代码使用的是我手写代码,逻辑和 RxJava 一致,细节可能不同。 手写 RxJava 项目地址 私有仓库 主流程分析 Observable 1 2 3 4 5 6 7 8 9 10 11 abstract class Observable<T> { fun subscribe(observable: Observer<T>) { sub...

MMVK

MMKV 引入 MMKV 1 2 3 4 dependencies { implementation 'com.tencent:mmkv-static:1.2.10' // replace "1.2.10" with any available version } MMKV 使用 Application 1 2 3 4 5 6 7 public void onCreate...