自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 资源 (3)
  • 收藏
  • 关注

原创 【无标题】

啊飒飒。

2023-09-21 15:43:29 106

原创 Android Json 数据解析优化

Android Json 数据解析优化

2023-02-23 20:47:58 978 2

原创 Room CursorWindowAllocationException

Room CursorWindowAllocationException

2023-02-07 11:53:59 740

原创 【单元测试】Android Espresso 使用解析(3.1.0 版本)

Espresso是Google推出来的一款提供给Android进行UI自动化测试的框架,其目标用户主要是针对开发人员。将Espresso中的默认替换为自定义故障处理程序后,可以进行其他或不同的错误处理,如截取屏幕截图或传递额外的调试信息。try {此故障处理程序抛出而不是,并将其他所有故障的处理委托给。您可以在测试的setUp()方法中向Espresso注册。

2023-01-31 10:03:51 899

原创 【单元测试】Android Testing 踩坑之旅

【代码】【单元测试】Android Testing 踩坑之旅。

2023-01-30 20:14:40 642

原创 【单元测试】Android Testing

随着应用的功能不断丰富,且多样性不断的提升,手动测试应用以验证行为的做法变得愈加乏味、昂贵,甚至不切实际。即便再简单的现代应用,也需要您对日益增多的测试要点进行验证,如界面流程、本地化或数据库迁移。您可以选择安排QA团队来手动验证应用是否正常运行,但在该阶段修复问题会产生较高成本,最好在开发过程中尽早解决这些问题。Android自动化测试是尽早捕获问题的最佳方式。通过持续对应用程序运行测试,您可以在公开之前发布应用程序是应用程序开发中的性能和测试性,测试其功能是否正确、功能性能和测试性。

2023-01-30 12:10:09 582

原创 Git submodule 子模块的管理和使用

Git submodule 子模块的管理和使用

2023-01-13 11:36:36 617

原创 Git 常规命令

Git 常规命令

2023-01-13 11:33:49 148

原创 基于 Android JaCoCo 针对手工测试的代码变更覆盖率方案

代码: 代码:4.2 新建一个 jacoco.gradle 文件在项目根目录下新建一个 文件,这个文件提供给各个模块使用。4.3 在依赖的 Library 模块中添加依赖在您的 或子模块的 文件中依赖这个 4.4 配置 AndroidManifest.xml4.5 生成测试报告(1)首先我们通过命令行安装 app)选择您的 ,安装 到您的手机上。(2)命令行启动(3)点击测试这个时候你可以操作您的 ,对您想进行代码覆盖率检测的地方,进入到对

2022-06-20 10:14:44 910 1

原创 Android App Initializer 实现方案

Android App Initializer 实现方案

2022-06-07 20:56:49 1467

原创 Room 使用解析(2.4.2 版本)

文章目录1、Room 简介2、Room 依赖2.1 dependencies 配置2.2 gradle 配置3、Room 简单使用3.1 Room 主要组件3.2 数据实体3.3 数据访问对象 (DAO)3.4 数据库类3.5 调用4、Room 的 7 个高级技巧4.1 预填充数据库4.2 使用 DAO 的继承能力4.3 用最少的样板代码在事务中执行查询4.4 只读你需要的4.5 在具有外键的实体之间实施约束4.6 通过简化一对多查询 @Relation4.7 避免可观察查询的误报通知5、Room 数据库增

2022-05-27 17:37:20 1942

原创 Android App 稳定性优化

文章目录1、如何提升 App 的稳定性?1.1 开发阶段1.1.1 技术评审1.1.2 强制 Code Review 机制1.1.3 主动容错1.2 测试阶段1.3 发布阶段1.4 运维阶段1.4.1 Crash 监控日志收集1.4.2 非 Crash 的异常监控日志收集1.4.2 报警策略1.5 降级容灾策略1.5.1 配置平台1.5.2 安全模式1.5.3 统跳中心1.5.4 动态化修复2、建立有效的 Code Review 机制2.1 什么是 Code Review?2.2 Code Review 需

2022-04-10 01:00:55 976

原创 Android 热修复实现原理

文章目录1、热修复背景2、Instant Run 概述3、类加载3、热修复3.1 代码修复3.1.1 类加载方案3.1.2 底层替换方案3.2 资源修复3.3 so 修复1、热修复背景当发布的版本出现小 Bug 需要及时修复的时候,如果按照传统的方式,这就需要去解决 Bug、测试打包重新发布,而用户也需要重新安装你发布的新版本才能解决这个 Bug,使用这个时候可以使用热修复去进行及时修复,而且不需要发布新的版本,只需要发布补丁包,在客户不知不觉间修复掉 Bug。个人认为现在市面上比较成熟稳定的热修复

2022-04-03 15:57:42 3571

原创 ViewModel 源码解析(2.4.1 版本)

文章目录1、ViewModel 简介2、ViewModel 配置与基本用法2.1 依赖引入与配置2.2 基本用法2.2.1 ViewModel 简单使用2.2.2 ViewModel 结合 SavedState 组件依赖使用2.2.3 ViewModel 在 Fragment 间通信2.2.4 ViewModel 跨页面的数据共享3、ViewModel 源码解析4、ViewModel 总结5、ViewModel 相关问题1、ViewModel 简介Android Jetpack 库中的一员,在 MVV

2022-04-02 22:13:08 622

原创 LiveData 源码解析(2.4.1 版本)

文章目录1、LiveData 简介2、LiveData 配置与基本用法2.1 依赖引入与配置2.2 基本用法2.2.1 LiveData 简单使用2.2.2 LiveData 扩展2.2.3 LiveData map() 转换2.2.4 LiveData switchMap() 转换2.2.5 LiveData 合并多个源(MediatorLiveData)3、源码解析3.1 LiveData 核心方法3.2 LiveData 注册观察者3.3 LiveData 事件分发3.4 LiveData 事件更新4

2022-04-02 16:42:24 2322

原创 Lifecycle 源码解析(2.4.1 版本)

文章目录1、Lifecycle 简介2、Lifecycle 配置与基本用法2.1 依赖引入与配置2.2 基本用法2.2.1 Lifecycle 简单使用2.2.2 普通 Activity 实现 Lifecycle2.2.3 ProcessLifecycleOwner 实现前后台切换3、Lifecycle 源码解析3.1 Fragment 是如何实现 Lifecycle 的3.2 Activity 是如何实现 Lifecycle 的3.3 Lifecycle 是如何分发宿主状态的5、问题5.1 Compone

2022-04-01 00:28:22 3971

原创 Retrofit 源码解析(2.9.0 版本)

文章目录1、简介2、Retrofit 配置与基本用法2.1 依赖引入与配置2.2 基本用法3、Retrofit 的注解3.1 请求方法注解3.2 请求头注解3.3 请求参数注解3.4 请求和响应格式(标记)注解4、Retrofit 注解的配合使用4.1 @GET 使用4.2 @GET、@Query 使用4.3 @GET、@QueryMap 使用4.4 @POST 使用4.5 @POST、@FormUrlEncoded、@File 使用4.6 @POST、@FormUrlEncoded、@FieldMap 使

2022-03-30 22:41:18 1608 1

原创 OkHttp 源码解析(4.9.1 版本)

文章目录1、OkHttp 简介2、OkHttp 配置与基本用法2.1 依赖引入与配置2.2 基本用法3、OkHttp 常见对象介绍4、OkHttp 源码解析4.1 当我们调用`okhttpClient.newCall(request).execute()`方法进行同步请求时:4.2 当我们调用`okhttpClient.newCall(request).equeue()`方法进行异步步请求时:4.3、七层拦截器源码解析4.3.1 全局拦截器4.3.2 重定向拦截器4.3.3 桥接拦截器4.3.4 缓存拦截器

2022-03-30 04:38:15 5062

原创 ARouter 源码解析(1.5.2 版本)

1、简介ARouter 是阿里巴巴开源的 Android 平台中对页面、服务提供路由功能的中间件,通俗来讲就是一个用于帮助 Android App 进行组件化改造的框架,并且支持模块间的路由、通信、解耦等等。官方网站2、ARouter 配置与基本用法2.1 依赖引入与配置// 根目录的 build.gradlebuildscript { dependencies { classpath // ARouter classpath "c

2022-03-28 19:44:28 2135

原创 如何优雅的实现 Activity、Fragment 相互之间的 Bundle 传值

1、简介从事过 Android 开发的同学,肯定遇到过 Activity 与 Activity 间的 Bundle 传值,或者 Activity 与 Fragmnet 中的 Bundle 传值,或者 Fragment 与 Fragmnet 中的 Bundle 传值参数定义赋值取值问题,一两个参数定义赋值取值还好解决,但是一旦随着版本后续不断迭代涌现出大量参数传递的时候,参数中 key 的定义、参数中的赋值和取值就成了一个非常恶心的问题,且非常不好维护,基于这个原因通过参考 Navigation 源码的思

2022-03-22 14:14:21 2633

原创 Java 线程

1、线程是什么?一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。通俗来说,线程是 CPU 调度的最小单位,一个进程中可以包含多个线程,在 Android 中,一个进程通常是一个 App,App 中会有一个主线程,主线程可以用来操作界面元素,如果有耗时的操作,必须开启子线程执行,不然会出现

2022-03-16 10:09:53 224

原创 Git局域网共享仓库搭建(Mac)

Git 局域网共享创库搭建(Mac)

2022-03-09 22:05:13 1718

原创 【设计模式】代理模式

1、模式定义代理模式:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。静态代理:工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。基于 JDK 实现动态代理:通过jdk提供的工具方法 Proxy.newProxyInstance 动态构建全新的代理类(继承 Proxy 类,并持有 InvocationHandler 接口引用)字节码文件并实例化对象返回。(jdk 动态代理是由 java 内部的反射机制来实例化代理对象,并代理的调用委托类方法)还有基于其它实现动态代理,这里不做详

2022-03-09 22:01:54 111

原创 【设计模式】责任链模式

1、模式定义职责链模式:使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。2、代码实现示例:员工出差报销费用,不同领导有不同的报销金额权限,组长5000元内,主管10000元内,经理20000元内,老板40000元内。/** * 员工抽象类 */public abstract class AbstractPerson { /** * 获取元具体的报销费用 *

2022-03-09 22:00:53 93

原创 【设计模式】抽象工厂模式

1、模型定义抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为 Kit 模式,属于对象创建型模式。2、代码实现示例:采购商需要采购 x 台华为 P30 和150台华为 P30、x 台小米3和250台小米4。public interface IPhone { void plamGame(String gameName); void callPhone(String phoneNumber);}public class Hu

2022-03-09 22:00:13 140

原创 【设计模式】工厂方法模式

1、模型定义工厂方法模式又称为工厂模式,也叫虚拟构造器模式或者多态工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。2、代码实现示例:使用华为或者小米手机玩游戏和拨打电话。public interface IPhone { void plamGame(String gameName); void

2022-03-09 21:59:08 115

原创 【设计模式】观察者模式

1、模式定义观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。被观察者 订阅 观察者 => Observable Subscribe Observer2、代码实现// 观察者

2022-03-09 21:57:53 89

原创 ArraySet 源码解析

1、简述我们都知道 HashSet,它属于 java.util 包下,但是很多人可能对 ArraySet 并不是很熟悉,通俗来说 ArraySet 属于 android.util 包下,是用于 Android 平台某些情况替换 HashSet 的数据结构。使用限定:minSdkVersion 必须大于等于 23(Android 6.0)。2、归纳实现了 Collection 和 Set 接口。底层采用两个一维数组,第一个数组是整型数组,且有序,存储 key 对应的 hash 值,第二个数组存

2022-03-09 18:00:39 3317

原创 ArrayMap 源码解析

1、简述我们都知道 HashMap,它属于 java.util 包下,但是很多人可能对 ArrayMap 并不是很熟悉,通俗来说 ArrayMap 属于 android.util 包下,是用于 Android 平台某些情况替换 HashMap 的数据结构。使用限定:minSdkVersion 必须大于等于 19(Android 4.4)。2、归纳实现了 Map 接口。底层采用两个一维数组,第一个数组是整型数组,且有序,存储 key 对应的 hash 值,第二个数组存储 key 和 value

2022-03-09 17:35:22 2918

原创 TreeSet 源码解析

1、简述TreeSet 底层是采用 TreeMap 实现的一种 Set 集合。2、归纳继承于 AbstractSet 抽象类,实现了 NavigableSet 接口。实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。底层默认基于 TreeMap 实现的,无序,不可重复,不允许 null 的存在。单线程安全,多线程不安全。3、分析由于 TreeSet 源码较小,主要功能都在 TreeMap 类已经实现,所以咱们直接看源码。public

2022-03-09 15:46:43 500

原创 TreeMap 源码解析

1、简述今天我们来介绍下 TreeMap,TreeMap 是基于红黑树结构实现的一种 Map。那什么又是红黑数呢?(1)每个节点必须是红色或者黑色;(2)根节点是黑色;(3)每个叶子节点(NIL 节点,空节点)是黑色的;(4)如果一个节点是红色的,则它两个字节点都是黑色的,也就是说在一条路径上不能出现相邻的两个红色节点;(5)从任一节点到每个叶子的所有路径都包含相同数目的黑色节点。如何保持红黑树特性?每当添加或删除节点后,红黑树就发生了变化,可能不再满足上述五种特性,所以为了保持红黑树以

2022-03-09 09:26:42 710

原创 Hashtable 源码解析(jdk1.8)

1、简述HashTable 是 Map 接口线程安全版本的实现类,数据结构和方法实现与 HashMap 类似,不过目前基本上被弃用。2、归纳继承 Dictionary,实现了 Map 接口,实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。底层是基于数组+单向链表实现的,无序,不可重复,不允许 null 键和 null 值存在。默认初始容量为11,默认负载因子为0.75,扩容时扩容为原来容量的2倍+1。采用 Synchronized 同步锁,锁方

2022-03-08 23:32:52 412

原创 LinkedHashSet 源码解析

1、简述本篇内容我们来聊聊我们日常开发中经常使用的一个类 LinkedHashSet,相信大家都不陌生。2、归纳继承于 HashSet,基于 LinkedHashMap 实现的,有序(插序),不可重复,允许 null 的存在。默认容量为16,负载因子0.75,其实内部就是包装了一个 HashMap,HashMap 的 key 放的是其存入的值,value 放的是一个 Object 对象。单线程安全,多线程不安全。3、分析由于 LinkedHashSet 源码较小,主要功能都在 Has

2022-03-08 19:02:40 308

原创 HashSet 源码解析

1、简述本篇内容我们来聊聊我们日常开发中经常使用的一个类 HashSet,相信大家都不陌生。2、归纳继承了 AbstractSet 抽象类,实现了 Set 接口,实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。默认容量为16,负载因子0.75,其实内部就是包装了一个 HashMap,HashMap 的 key 放的是其存入的值,value 放的是一个 Object 对象。单线程安全,多线程不安全。3、分析3.1、成员变量public cl

2022-03-08 18:37:18 183

原创 LinkedHashMap 源码解析

1、简述LinkedHashMap 继承于 HashMap,在 HashMap 的基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致性的问题。2、归纳基于 HashMap 实现的,继承于 HashMap,有序(插序),不可重复,允许 null 键和 null 值存在。与 HashMap 的区别是,HashMap 的链表是单链表,而这里的链表是双向链表。比 HashMap 多一个 accessOrder 属性,默认 false,若为 false,遍历双向链

2022-03-08 17:22:20 424

原创 SparseArray 源码解析

1、简述我们都知道 HashMap,它属于 java.util 包下,但是很多人可能对 SparseArray 并不是很熟悉,通俗来说 SparseArray 属于 android.util 包下,是用于 Android 平台某些情况替换 HashMap 的数据结构。更具体的来说,是用于替代 key 为 int 类型,value 为 Object 类型的 HashMap。和 ArrayMap 类似,它的实现相比于 HashMap 更加节省空间,而且由于 key 指定为 int 类型,也可以节省 int

2022-03-08 12:05:00 1609

原创 Kotlin携程

1、什么是协程一套由Kotlin官方提供的线程框架API,支持线程切换,可以用看起来同步的方式写出异步代码,从而实现其非阻塞式挂起。2、什么是挂起就是可以自动切换回来的切线程。3、什么是非阻塞式指协程可以用看起来阻塞式的代码写出非阻塞式的操作。4、 Kotlin协程相当于轻量级线程?这是Kotlin官方描述的,其实是错误的描述,只是为了推广Kotlin协程搞的一个幌子而已,Kotlin的协程要对比也是跟Java的线程池去进行对比才有意义,具体代码分析如下:[外链图片转存失败,源

2022-03-04 00:48:55 1224

原创 Kotlin基础知识

1、Kotlin特点简洁,相对于Java语言,大大减少代码数量安全,在编译时期就处理了可能会产生的空指针异常,若产生空指针编译不会通过1、let、also、apply、run、with之间的区别?函数名定义参数返回值是否扩展函数letfun <T, R> T.let(block: (T) -> R): R = block(this)it闭包形式返回是alsofun T.also(block: (T) -> Unit): T { b

2022-03-04 00:48:19 340

原创 Android WebView与JS的交互方式

前言现在很多App都内置了Web网页,比如很多电商App,淘宝、天猫、京东、拼多多、网易考拉等等,那么它们又是如何实现的呢?这里就不得不涉及到Android的WebView控件,通过WebView去动态加载一个Web网页,而Web网页的技术实现又将涉及到Html、css样式、JavaScript(简称JS)这些语言。上述功能无可避免的将会涉及到Android客户端与Web网页交互的实现,所以我们将全面介绍Android通过WebView与JS的交互方式。目录[外链图片转存失败,源站可能有防盗

2022-03-04 00:47:24 4451

原创 Android WebView的使用攻略

前言现在很多App都内置了Web网页,比如很多电商App,淘宝、天猫、京东、拼多多、网易考拉等等。那么它们又是如何实现的呢?这里就不得不涉及到Android的WebView控件,通过WebView去动态加载一个Web网页,所以我们将全面介绍Android WebView。目录[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KtDd5uuk-1646325947466)(http://note.youdao.com/yws/res/16277/WEBRESOURCE

2022-03-04 00:46:27 902

针对Solr6.6.0的IK分词器

包含ik-analyzer-solr5-5.x.jar、solr-analyzer-ik-5.1.0.jar、ext.dic、IKAnalyzer.cfg.xml、stopword.dic

2018-03-15

mysql和oracle连接驱动jar包

包含mysql-connector-java-5.1.7-bin.jar和ojdbc14.jar,对应solr6.6.0关联mysql和oracle数据库的jar包

2018-03-15

完美使用fragment+SlidingMenu做出的侧边栏效果

该侧边栏效果使用了activity嵌套fragment,其继承了SlidingFragmentActivity来实现的,侧边栏效果非常完美。

2015-10-12

空空如也

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

TA关注的人

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