自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

汪子涵的博客

加速度

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

原创 事件分发 & 嵌套滑动 & 滑动冲突

推荐一篇事件分发好文章:https://mp.weixin.qq.com/s/5zrZOVQlV6LAOgpD9DF35g要求:中插卡片不支持ViewPager左右滑动,支持Feed流竖向滑动,支持内部卡片横向滑动。UI效果图如下

2020-02-21 15:49:41 313

原创 下拉刷新原理(基础理论)

下拉刷新布局主要包含Loading视图、主体视图如果下拉刷新布局包的是CoordinatorLayout,一般用AppBarLayout的偏移来控制是否开始下拉刷新,是否开始下拉刷新操作,由上层来控制

2020-02-21 15:47:43 535

原创 深入探索安卓热修复技术-观后感

代码修复:底层替换方案:实时生效、兼容性差(厂商可以改动Method结构体)、限制条件多(不能对原有类进行方法和字段的增减,会改变字段和方法得索引,如果是增加,还会存在访问不到新增字段的问题) 支付宝 AndFix:底层结构替换、运行时生效、Dalvik和ART全兼容 阿里百川 HotFix:逻辑解耦版 类加载方案:冷启动生效(在App运行到一半的时候,所有需要发生变更的类已经被加...

2019-10-18 20:40:39 210

原创 Kotlin Language

Kotlin是一门全栈语言----------词法部分----------数据类型:Boolean、Byte(8)、Short(16)、Int(32)、Long(64)、Float(32)、Double(64)自动装箱拆箱:Int -> int Integer、Char -> char Character不可隐式转换:val anInt: Int = 5 val...

2019-10-01 22:19:13 632 1

原创 RxJava 基本原理

Retrofit是对网络框架的封装,真正的网络请求是通过OkHttp完成的Retrofit主要用到了适配器模式使用Retrofit五个步骤:创建网络请求接口,设置请求类型和参数 创建Retrofit实例,设置数据解析器(Gson、XML、Protobuf)和网络适配器 创建接口对象(动态代理),配置网络请求参数 调用接口方法返回Call对象或适配器封装的对象 处理适配器逻辑或直...

2019-05-03 15:49:51 830 1

原创 安卓常见布局 & 布局优化

过度绘制:开发者选项(调试GPU过度绘制)优化方法:移除默认的Window背景:getWindow().setBackgroundDrawable(null);移除不必要的背景:ViewPager加载多个Fragment 组成的首页界面,如果每个Fragment都设置有背景色的话,你就可以不用给Activity的根布局设置背景减少透明度的使用:由于需要混色处理,至少渲染两次...

2019-04-25 11:00:35 454

原创 自定义属性

Demo演示:自定义属性的声明文件(values/attrs.xml)<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="test"> <attr name="text" format="string" /> ...

2019-04-23 15:13:18 283

原创 自定义 View

自定义View基础知识:事件分发机制、Android坐标体系、Canvas变换、自定义属性、补间动画原理(Matrix矩阵变换、第一帧和后续帧的区别)、LayoutInflaterActivityThread#handleStartActivity方法会调用Activity#onCreate方法,进而Activity#setContentView调用PhoneWindow#setContent...

2019-04-23 11:56:27 245 1

原创 View 坐标系

View坐标体系:View真实位置是可以响应点击事件的,需要区分Canvas变换(补间动画绘制)View的原始位置主要由四个顶点来决定,分别对应View的四个属性:left、top、right、bottom,我们可以通过get方法来得到这四个参数,而且width =right -left、hight =bottom -top,子视图的原始位置受父视图原始坐标、父视图的Padding和当...

2019-04-21 11:55:05 324

原创 RecyclerView

你想要控制Item显示方式,请使用LayoutManager 你想要控制Item间隔,请使用ItemDecoration 你想要控制Item增删动画,请使用ItemAnimator 你想要控制点击、长按事件,请自己写下面是一个Demo,主要讲解如何使用RecyclerView,后面会分别介绍各个功能public class HomeActivity extends AppCompat...

2019-03-26 10:47:27 327

原创 OKHttp 原理

网络库比较:HttpClient代码扩展性差,已经废弃;HttpUrlConnection是一个轻量级的http客户端,从4.4开始,底层实现采用okHttp,okHttp是一个高性能的http库,支持ip切换、url重试、线程管理、缓存管理、连接复用等,volley一个简单的一步http库,缺点是不支持同步,不适合大文件下载,volley在2.3以上使用的是HttpUrlConnection,2...

2019-02-18 16:29:11 8914

原创 网络协议基础

URI和URL的区别:URI是uniform resource identifier,统一资源标识符,用来唯一标识一个资源,格式如下:file://a:1234/a/b/c.txt,对应的是scheme、host、port、path。URL是uniform resource locator,统一资源定位器,它是一种具体的URIHTTP协议特点:应用层协议、支持Client-Server模式...

2019-01-17 17:53:07 349 1

原创 ViewModel

程序架构主要是为了分离业务逻辑、数据、界面显示三大模块,在改进和个性化定制界面的同时,不需要重新编写业务逻辑MVP与MVC的区别:在MVC中View可以与Model直接交互。在MVP中View与Model不能直接交互,而是通过Presenter来控制View、ModelMVP架构的优点:模型和视图完全分离,我们可以修改模型而不影响视图 可以将Presenter用于多个视图,而不需...

2019-01-04 18:12:11 450 1

原创 Android 杂记

Android各个布局异同:LinearLayout按照垂直和水平顺序依次排列子元素,尽量少用layout_weight(子元素占用剩余空间的大小比例),会导致二次测量;FrameLayout所有子元素都叠放在左上角;RelativeLayout按照各个子元素之间的关系完成布局;TableLayout为表格布局,适用于N行N列的布局格式;AbsoluteLayout是绝对位置布局,在此布局中的...

2018-03-08 21:35:05 533

原创 Android 构建流程

Gradle定义:Gradle是以Groovy语言为基础,面向Java应用为主,基于DSL(领域特定语言)语法的自动化构建工具Gradle工作流程(生命周期):初始化、配置(afterEvaluate、whenReady)、执行Gradle依赖管理:声明依赖有三种方式:compile maven库的地址、compile files或fileTree引入jar包、compile本地工程,依赖...

2017-06-07 18:15:50 428

原创 Activity Lifecycle & LaunchMode

Task是一个具有栈结构的对象,一个Task可以管理多个Activity。Activity四种launchMode:standard、singleTop、singleTask、singleInstance,我们可以在AndroidManifest.xml中通过Android:launchMode属性来配置启动模式

2017-05-15 14:34:15 797 1

原创 Intent 参数详解

Intent封装了Android应用启动某个组件(Activity、Service、BroadcastReceiver)的“意图”,不仅如此,Intent还是各个组件之间通信的重要媒介(使用Intent携带Bundle对象)使用Intent启动不同组件的方法:startActivity、startActivityForResult、startService、bindService、sendBr...

2017-05-15 13:55:18 1921

原创 Fragment 生命周期

生命周期、使用方式、hide、show、attach、detach、remove、add、replace作用:我们可以把Fragment当成Activity界面的一个组成部分,甚至Activity的界面可以完全由不同的Fragment组成,而且Fragment拥有自己的生命周期并能进行事件处理,这样就不必在Activity中写一堆事件处理逻辑了,更为重要的是,你可以动态的添加、替换和移除某个F...

2017-05-13 21:26:49 379

原创 安卓动画原理解析

安卓动画主要有三类:逐帧动画(Drawable Animation、Frame Animation)、补间动画(View Animaiton、Tweened Animation)、属性动画(Property Animation),其中,View Animation只能修改View组件的部分属性、动画效果是绘制出来的,组件并没有真正改变,而Property Animation可以修改View组件的任...

2017-05-13 16:58:44 475

原创 字符串常量池-源码演示

【代码】字符串常量池。

2023-11-02 21:47:09 113

原创 C++ Primer(读书笔记)

整型字面值:以0开头的整数代表八进制数,以0x或0X开头的代表十六进制,对应20、024、0x14,默认情况下,十进制字面值时带符号值,八进制和十六进制字面值即可能是带符号的也可能是无符号的。八进制和十六进制字面值的类型时能容纳其数值的int、unsigned int、long、unsigned long、long long、unsigned long long中的尺寸最小者。在C++中,我们要尽量避免依赖于实现环境的行为,如果我们把int的尺寸看成是一个确定不变的已知值,那么这样的程序是不可移植的。

2023-07-03 17:12:05 844

原创 深入理解Java虚拟机(读书笔记)

JRE是支持Java程序运行的标准环境,包括:Java类库API中的Java SE API子集和Java虚拟机。JDK是支持Java程序开发的最小环境,包括:Java程序设计语言、Java虚拟机、Java类库。Java程序设计语言、Java虚拟机、Class文件格式、Java类库API、Java三方框架。动态语言支持:Java是静态语言,为其他运行在Java虚拟机上的动态语言提供支持。Lambda项目:支持Lambda表达式,支持函数式编程。Garbage-First收集器。

2023-06-06 10:55:32 1024

原创 算法 & 数据结构面试篇

切题四件套Clarification、Possible solutions、Coding、Test cases常用数据结构数组、链表、队列、栈、堆、哈希表、树、二叉查找树、字母树、LRU缓存常用算法递归、贪心、分治、广度优先搜索、深度优先搜索、二叉树遍历、动态规划、二分查找、图时间/空间复杂度O(1)、O(logn)、O(n)、O(nlogn)、O(n2)、O(n3)、O(2n)、O(n!)常见算法复杂度二分查找:O(logn)、二叉树遍历:O(n)、归并排序:O(nlo

2021-09-18 12:17:48 200

原创 安卓视图绑定

视图绑定功能可按模块启用。要在某个模块中启用视图绑定,请将 viewBinding 元素添加到其 build.gradle 文件中,如下例所示android { viewBinding { enabled = true }}如果您希望在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore="true" 属性添加到相应布局文件的根视图中<LinearLayout ... tools:viewBindingIg

2021-09-18 09:59:02 204

原创 通用弹幕实现

IBarrageLayoutinterface IBarrageLayout { // 弹幕是否可点击 fun setEnableTouch(enable: Boolean) // 添加弹幕控制器 fun addController(controller: AbsBarrageController, priority: Int = 0) // 清除弹幕控制器 fun clearController() // 清除弹幕 fun cl

2021-09-07 18:23:20 181

原创 通用鉴权框架

Cookie、Token 的区别Cookie 主要指 Session ID 存储到 Cookie 中进行的验证的方式,该方式存在一些弊端:服务端需要存储 Session 信息,扩展性差 跨域资源共享成本高,容易出现权限问题 教室后台无法获取宿主的 Session 信息Token 是无状态的,服务端不需要保存用户信息,方便服务端扩展,可以跨域共享客户端流程宿主端:通过账户名、密码登陆 实现 Token 获取接口(需要特殊处理无网、SDK未初始化的情况) 登出后主动调用教室的 Tok

2021-09-07 14:53:55 472

原创 LiveData 原理

声明周期变化时调用LiveData.dispatchingValue在调用 observe 时,我们需要传入 LifecycleOwner 和 Observer,在 observe 方法内部通过 LifecycleBoundObserver 将Observer 和LifecycleOwner 关联,并监听LifecycleOwner 状态public void observe(LifecycleOwner owner, Observer<? super T> observer)...

2021-09-03 18:21:50 164

原创 HashMap 原理

在 JDK 1.7 中,HashMap 采用数组+链表的方式实现 在 JDK 1.8 中,HashMap 采用数组+链表 / 红黑树实现Entry[] table=new Entry[capacity];基础变量DEFAULT_INITIAL_CAPACITY(Table 数组的初始大小):1 << 4,这里需要是 2 的 n 次方,数组扩容的时候也是每次扩容 2 倍,根本原因是在计算哈希散列时,会使用下面的公 hashCode 的高 16 位和低 16 位进行异或运算,避免只使

2021-09-03 15:32:51 68

原创 如何设计一个图片加载框架

线程池:Glide使用了三个线程池,不考虑动画的话就是两个public final class GlideBuilder { ... private GlideExecutor sourceExecutor; //加载源文件的线程池,包括网络加载 private GlideExecutor diskCacheExecutor; //加载硬盘缓存的线程池 ... private GlideExecutor animationExecutor; //动画线程池 ...

2021-08-23 19:02:28 171

原创 Glide 图片框架

Glide 框架专注于图片列表更快、更平滑的滚动。实际上,该框架几乎能满足图片拉取 / 缩放 / 显示的一切需求 对外提供了高性能、可扩展的图片解码管道(Pipeline)以及自动的资源缓冲池 多种格式支持,包括视频快照、图片、GIF 图 默认基于定制化的 HttpUrlConnection 的网络栈,但同时也提供了快速集成OkHttp 的工具库 框架充分考虑了 Android 图片加载性能的两个关键指标 图片解码速度 解码图片带来的资源压力(避免主线程 IO 操作和频繁的垃圾回收) .

2021-08-19 12:19:45 617

原创 UML 类图

1、策略模式定义个策略接口,不同的实现类提供不同的具体策略算法, 同时它们之间可以互相替换IStrategy 接口定义了策略方法,Strategy1 和 Strategy2 通过实现 IStrategy 提供不同的策略,而 User 组合了 IStrategy ,可以通过给 User 对象设置不同具体实现类来让其获得不同的策略2、工厂模式针对每一种产品提供一个工厂类,通过不同的工厂实例来创建不同的产品实例不同工厂类实现同一个工厂接口,返回不同产品3、装饰者模式动态的给一个

2021-08-18 11:52:05 253

原创 View 加载流程

ActivityThread.handleStartActivityActivityThread.performStartActivityInstrumentation.newActivityActivity.attach 初始化 PhoneWindow 实例 Instrumentation.callActivityOnCreate...

2021-08-17 12:18:01 270

原创 LeakCanary

如何获取上下文信息LeakCanary 只需引入依赖,不需要初始化代码,就能执行内存泄漏检测了,它是通过 ContentProvider 获取应用的 Context。这种获取 Context 方式在开源第三方库中十分流行。如下 AppWatcherInstaller 在 AAR 包的Manifest 文件中注册internal sealed class AppWatcherInstaller : ContentProvider() { override fun onCreate(): B.

2021-08-16 21:51:59 195

原创 Dialog & PopupWindow

Dialog 和 PopupWindow 在开发中是比较常用的两个 View,二者都需要在 Window 上显示出来,正所谓有 View 的地方就有 Window,同时二者都需要调用 setContentView 方法,具体原理请查看文章(https://blog.csdn.net/xgangzai/article/details/81390630)Dialog 与 PopupWindow 的区别二者可以手动设置显示位置。Dialog 默认居中Gravity.CENTER,PopupWindow .

2021-08-14 09:16:34 244

原创 依赖注入框架

依赖注入是用于实现控制反转的常见方式之一,另一种实现方式是“依赖查找”依赖注入的实现方式基于构造函数public class Man { Car car; public Man(Car car) { this.car = car; }}基于 setter 方法public class Man { public void setCar(Car car) { this.car = car; }}基于 inje

2021-08-13 17:51:55 443

原创 Kotlin Flow

Flow 非常适合实时数据更新和无休止的数据流,Flow 已经被集成到许多 Jetpack 库中

2021-08-09 12:48:28 520

原创 Kotlin Coroutines

什么是协程,谈谈你对协程的认识协程是一段可执行的任务,可挂起/恢复执行,概念上语言无关,通常实现是用户态的协作式调度,从具体实现上来说,可以分为两大类:有栈协程和无栈协程有栈协程:协程切换会保存完成上下文,可以在其任意嵌套函数中被挂起 无栈协程:通过状态机维护代码运行状态,协程切换的本质是指令指针寄存器的改变Coroutine ScopeCoroutineScope public interface CoroutineScope { /** * The conte.

2021-08-07 19:48:45 711

原创 应用启动流程

Activity 启动流程系统在启动时通过 android.intent.action.MAIN 和 android.intent.category.HOME启动 Launcher App Launcher App通过PackageManager遍历已安装应用,通过android.intent.action.MAIN 和 android.intent.category.LAUNCHER 拿到所有应用的入口 用户点击图标时通过Activity#startActivity启动应用,Activity...

2021-07-22 12:05:49 299

原创 安卓数据存储

数据库SQLiteOpenHelper:A helper class to manage database creation and version management.class DatabaseHelper(context: Context?, name: String?, factory: CursorFactory?, version: Int) : SQLiteOpenHelper(context, name, factory, version) { compan..

2021-07-06 16:17:07 168

原创 异步处理 & 定时任务

安卓系统常用的异步处理机制:Handler、HandlerThread、IntentService、AsyncTask、Thread、ThreadPool、RxJava、CoroutinesHandlerHandler机制主要有四个类实现,分别为Handler、Looper、MessageQueue、Message,作用如下:Message用于承载线程之间传递的消息 MessageQueue是一个用链表实现的先进先出队列,用来存储Message Handler用于把Message插入Mess

2021-07-05 16:32:31 316

空空如也

空空如也

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

TA关注的人

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