- 博客(84)
- 资源 (3)
- 收藏
- 关注
原创 Room CursorWindowAllocationException
Room CursorWindowAllocationException
2023-02-07 11:53:59 1031
原创 【单元测试】Android Espresso 使用解析(3.1.0 版本)
Espresso是Google推出来的一款提供给Android进行UI自动化测试的框架,其目标用户主要是针对开发人员。将Espresso中的默认替换为自定义故障处理程序后,可以进行其他或不同的错误处理,如截取屏幕截图或传递额外的调试信息。try {此故障处理程序抛出而不是,并将其他所有故障的处理委托给。您可以在测试的setUp()方法中向Espresso注册。
2023-01-31 10:03:51 1091
原创 【单元测试】Android Testing
随着应用的功能不断丰富,且多样性不断的提升,手动测试应用以验证行为的做法变得愈加乏味、昂贵,甚至不切实际。即便再简单的现代应用,也需要您对日益增多的测试要点进行验证,如界面流程、本地化或数据库迁移。您可以选择安排QA团队来手动验证应用是否正常运行,但在该阶段修复问题会产生较高成本,最好在开发过程中尽早解决这些问题。Android自动化测试是尽早捕获问题的最佳方式。通过持续对应用程序运行测试,您可以在公开之前发布应用程序是应用程序开发中的性能和测试性,测试其功能是否正确、功能性能和测试性。
2023-01-30 12:10:09 664
原创 基于 Android JaCoCo 针对手工测试的代码变更覆盖率方案
代码: 代码:4.2 新建一个 jacoco.gradle 文件在项目根目录下新建一个 文件,这个文件提供给各个模块使用。4.3 在依赖的 Library 模块中添加依赖在您的 或子模块的 文件中依赖这个 4.4 配置 AndroidManifest.xml4.5 生成测试报告(1)首先我们通过命令行安装 app)选择您的 ,安装 到您的手机上。(2)命令行启动(3)点击测试这个时候你可以操作您的 ,对您想进行代码覆盖率检测的地方,进入到对
2022-06-20 10:14:44 1087 2
原创 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 2523
原创 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 1046
原创 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 3712
原创 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 697
原创 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 2461
原创 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 4153
原创 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 1899 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 5396
原创 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 2214
原创 如何优雅的实现 Activity、Fragment 相互之间的 Bundle 传值
1、简介从事过 Android 开发的同学,肯定遇到过 Activity 与 Activity 间的 Bundle 传值,或者 Activity 与 Fragmnet 中的 Bundle 传值,或者 Fragment 与 Fragmnet 中的 Bundle 传值参数定义赋值取值问题,一两个参数定义赋值取值还好解决,但是一旦随着版本后续不断迭代涌现出大量参数传递的时候,参数中 key 的定义、参数中的赋值和取值就成了一个非常恶心的问题,且非常不好维护,基于这个原因通过参考 Navigation 源码的思
2022-03-22 14:14:21 2681
原创 Java 线程
1、线程是什么?一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。通俗来说,线程是 CPU 调度的最小单位,一个进程中可以包含多个线程,在 Android 中,一个进程通常是一个 App,App 中会有一个主线程,主线程可以用来操作界面元素,如果有耗时的操作,必须开启子线程执行,不然会出现
2022-03-16 10:09:53 247
原创 【设计模式】代理模式
1、模式定义代理模式:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。静态代理:工程师编辑代理类代码,实现代理模式;在编译期就生成了代理类。基于 JDK 实现动态代理:通过jdk提供的工具方法 Proxy.newProxyInstance 动态构建全新的代理类(继承 Proxy 类,并持有 InvocationHandler 接口引用)字节码文件并实例化对象返回。(jdk 动态代理是由 java 内部的反射机制来实例化代理对象,并代理的调用委托类方法)还有基于其它实现动态代理,这里不做详
2022-03-09 22:01:54 138
原创 【设计模式】责任链模式
1、模式定义职责链模式:使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。2、代码实现示例:员工出差报销费用,不同领导有不同的报销金额权限,组长5000元内,主管10000元内,经理20000元内,老板40000元内。/** * 员工抽象类 */public abstract class AbstractPerson { /** * 获取元具体的报销费用 *
2022-03-09 22:00:53 117
原创 【设计模式】抽象工厂模式
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 163
原创 【设计模式】工厂方法模式
1、模型定义工厂方法模式又称为工厂模式,也叫虚拟构造器模式或者多态工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。2、代码实现示例:使用华为或者小米手机玩游戏和拨打电话。public interface IPhone { void plamGame(String gameName); void
2022-03-09 21:59:08 151
原创 【设计模式】观察者模式
1、模式定义观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。被观察者 订阅 观察者 => Observable Subscribe Observer2、代码实现// 观察者
2022-03-09 21:57:53 113
原创 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 3416
原创 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 2975
原创 TreeSet 源码解析
1、简述TreeSet 底层是采用 TreeMap 实现的一种 Set 集合。2、归纳继承于 AbstractSet 抽象类,实现了 NavigableSet 接口。实现了 Cloneable 和 Serializable 接口,所以支持复制(拷贝)、序列化。底层默认基于 TreeMap 实现的,无序,不可重复,不允许 null 的存在。单线程安全,多线程不安全。3、分析由于 TreeSet 源码较小,主要功能都在 TreeMap 类已经实现,所以咱们直接看源码。public
2022-03-09 15:46:43 543
原创 TreeMap 源码解析
1、简述今天我们来介绍下 TreeMap,TreeMap 是基于红黑树结构实现的一种 Map。那什么又是红黑数呢?(1)每个节点必须是红色或者黑色;(2)根节点是黑色;(3)每个叶子节点(NIL 节点,空节点)是黑色的;(4)如果一个节点是红色的,则它两个字节点都是黑色的,也就是说在一条路径上不能出现相邻的两个红色节点;(5)从任一节点到每个叶子的所有路径都包含相同数目的黑色节点。如何保持红黑树特性?每当添加或删除节点后,红黑树就发生了变化,可能不再满足上述五种特性,所以为了保持红黑树以
2022-03-09 09:26:42 748
原创 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 535
原创 LinkedHashSet 源码解析
1、简述本篇内容我们来聊聊我们日常开发中经常使用的一个类 LinkedHashSet,相信大家都不陌生。2、归纳继承于 HashSet,基于 LinkedHashMap 实现的,有序(插序),不可重复,允许 null 的存在。默认容量为16,负载因子0.75,其实内部就是包装了一个 HashMap,HashMap 的 key 放的是其存入的值,value 放的是一个 Object 对象。单线程安全,多线程不安全。3、分析由于 LinkedHashSet 源码较小,主要功能都在 Has
2022-03-08 19:02:40 339
原创 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 204
原创 LinkedHashMap 源码解析
1、简述LinkedHashMap 继承于 HashMap,在 HashMap 的基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致性的问题。2、归纳基于 HashMap 实现的,继承于 HashMap,有序(插序),不可重复,允许 null 键和 null 值存在。与 HashMap 的区别是,HashMap 的链表是单链表,而这里的链表是双向链表。比 HashMap 多一个 accessOrder 属性,默认 false,若为 false,遍历双向链
2022-03-08 17:22:20 448
原创 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 1678
原创 Kotlin携程
1、什么是协程一套由Kotlin官方提供的线程框架API,支持线程切换,可以用看起来同步的方式写出异步代码,从而实现其非阻塞式挂起。2、什么是挂起就是可以自动切换回来的切线程。3、什么是非阻塞式指协程可以用看起来阻塞式的代码写出非阻塞式的操作。4、 Kotlin协程相当于轻量级线程?这是Kotlin官方描述的,其实是错误的描述,只是为了推广Kotlin协程搞的一个幌子而已,Kotlin的协程要对比也是跟Java的线程池去进行对比才有意义,具体代码分析如下:[外链图片转存失败,源
2022-03-04 00:48:55 1349
原创 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 373
原创 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 4531
原创 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 1063
针对Solr6.6.0的IK分词器
2018-03-15
mysql和oracle连接驱动jar包
2018-03-15
完美使用fragment+SlidingMenu做出的侧边栏效果
2015-10-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人