自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 通过Cloudflare Workers自定义代理规则

本文介绍了使用微软的 Copilot 时可能遇到的梯子设置问题,并提出了利用 Cloudflare Workers 来修改代理规则的解决方案。

2024-02-25 23:28:54 1178

原创 Git 常用操作

本文介绍了如何在Git中创建远程仓库、进行本地Git配置、克隆已有仓库、创建分支、提交代码、处理合并冲突、创建Tag等操作。同时还列举了一些常用的Git命令和操作。

2024-02-15 22:15:09 632 1

原创 掌握 Android JNI 基础

最近在看一些底层源码,发现 JNI 这块还是有必要系统的看一下,索性就写一写博客,加深加深印象🍻本文重点聊一聊一些干货,避免长篇大论

2024-01-30 22:57:57 1120

原创 OkHttp 基本使用&源码分析

本文介绍了 OkHttp 的基本使用以及源码分析,强烈建议配合源码进行阅读,否则会不知所云!!!第一次写源码分析类文章,辛苦各位老铁指正本文基于 OkHttp 3.11.0 版本进行分析,查看源码时请对应,或者直接下载文末的 Demo 进行查看文章目录OkHttp 的基本使用同步请求异步请求OkHttp 的源码分析同步请求异步请求OkHttp 的任务调度(Dispatcher)OkHttp 拦截器官方定义基本流程RetryAndFollowUpInterceptor(重试)BridgeInterc.

2020-09-22 09:18:14 403

原创 如何优雅的实现“查看更多”

开始前大家做一些文本简介展示需求时可能会遇到文本过长的场景,这时视觉同学可能会要求设置最大行数并在末尾展示"查看更多"(后面简称 MoreText)。废话不多说,先看下要求实现的效果(图为实现后的Demo效果):通过看效果很明显简单的使用 TextView 或者布局堆叠是没法实现这样的效果了,索性就自定义一个 View。功能实现本身非常简单,本文也只是简单记录下实现过程顺便复习一下文本相关的自定义 View。 文章代码过多可结合 Demo 查看实现思路基本的实现思路就是将每个文字进行排版布局

2020-09-22 09:16:05 28830 1

原创 支持段落的 TextView

开始前前几天做了一个需求(首章漏出),要求对一段文字可以进行分段且可以设置它的段间距,行间距等属性,大致需要以下功能点实现思路基本的实现思路就是将每个文字进行排版布局,计算出当前文字的位置,绘制在 View 上。准备知识点根据上述的实现思路我们需要准备下面的知识点:canvas.drawText(x,y) 的位置问题:首先 x 值,有两种:当你的 Paint 设置为myPaint.setTextAlign(Paint.Align.LEFT),x 就是文字最左侧到当前 view 左边

2020-09-16 09:47:23 488

原创 记一次优雅的回调方式

最近在用 Lifecycle 时学到了一种优雅的回调写法,特此记录一下。普通回调我们在写业务逻辑时难免会遇到需要设置回调的场景,也就是观察者模式,例如下面这个观察者:public interface Observer { void call();}使用时直接添加即可。public static void main(String[] args) { ObserverManager.addObserver(new Observer() { @Override .

2020-08-27 09:34:45 314

原创 Android ASM 插桩实践

上一章知道了如何获取 class 文件,那该如何进行插桩呢?本章告诉你!什么是 ASM?ASM 是一个字节码操作库,它可以直接修改已经存在的 class 文件或者生成 class 文件。 ASM 提供了一系列便捷的功能来操作字节码内容,与其它字节码的操作框架相比(例如 AspectJ),ASM 更加偏向于底层,直接操作字节码,在设计上更小、更快,性能上更好,而且几乎可以修改任意字节码。参考网易乐得团队关于插桩库的实验结果:通过上表,ASM 效率更高。不过效率高的代价就是 ASM 直接操作字节.

2020-07-26 21:47:26 4903 2

原创 Android Transform API

上一章知道如何自定义 Gradle插件后,我们到底可以用来做什么呢?难道只是用来定义一些简单的 Task?本章给你答案!什么是 Transform APIAndroid Gradle 工具从 1.5.0-beta1 版本开始,包含了 Transform API,它允许第三方插件在将编译后的类文件转换为 dex 文件之前对 .class 文件进行操作。Transform 的工作原理接下来看下它的工作原理:很明显它是一个链式结构,每个 Transform 都是一个 Gradle 的 Task,.

2020-07-26 21:46:38 1468 1

原创 Android Gradle 插件基础

本章跟大家一起探讨下 Gradle 基础知识:Project、Task和插件,由于是作为插桩的铺垫,所以我们重点放在 Gradle 插件 上,其他基础知识自行查阅。Project(项目)以咱们熟悉的 Android 项目举例说明:通过 Android Studio 创建项目会自动生成两个模块,一个就是以项目名来命名的根模块(ASMInjectDemo),另外一个就是 app 模块。这两个模块都有 build.gradle 文件,我们知道每个 build.gradle 文件都代表一个 Projec.

2020-07-26 21:45:30 750

原创 快速上手 Kotlin 开发系列之协程的挂起

站在巨人的肩膀上做个笔记,摘录自:https://kaixue.io/kotlin-coroutines-2前言上一节中我们提到了下面的示例,它使用了 async 关键字来创建一个协程。launch(Dispatchers.Main) { val avatar = async { getAvatar() }//获取用户头像 val logo = async { getLogo() }//获取 Logo mergeShowUI(avatar.await(), logo.awa.

2020-07-05 09:46:20 1247 4

原创 快速上手 Kotlin 开发系列之什么是协程

站在巨人的肩膀上做个笔记,摘录自:https://kaixue.io/kotlin-coroutines-1协程是什么协程的概念并没有官方的或者统一的定义,协程原本是一个跟线程非常类似的用于处理多任务的概念,是一种编程思想,并不局限于特定的语言。那在 Kotlin 中的协程是什么呢?其实就是一套有 Kotlin 官方提供的线程 API。就像 Java 的 Executor 和 Android 的 AsyncTask,Kotlin 协程也对 Thread 相关的 API 做了一套封装,让我们不.

2020-07-05 09:45:40 309

原创 快速上手 Kotlin 开发系列之类型映射

本节介绍 Kotlin 中类型映射。Kotlin 中有一个比较有意思的关键字:typealias,有点类似于 C/C++ 代码中的 define,可以将一个类映射到另一类上,但是不同的是 C/C++ define 是宏定义会在编译时转换成对应的类,而 Kotlin 中的 typealias 则表示两个类是完全一致的。在写代码时,不管是写原始类还是映射类,都是可以的。例如下面的示例中使用 A 类映射一个 File 类。public typealias A = File在创建对象时既可以用 A 类.

2020-07-05 09:44:27 527

原创 快速上手 Kotlin 开发系列之反引号

本节详细介绍 Kotlin 中的反引号。首先需要明确反引号是哪个,反引号:键盘左上角与波浪线在一起的符号。在 Kotlin 中反引号有两个特性:可以解决关键字冲突的问题可以强行将一个不合法的字符变为合法其中第 1 个特性在前面的文章【快速上手 Kotlin 开发系列之与 Java 互调 (1)】中已经提到过,不再赘述。今天着重介绍它的第 2 个特性,将不合法的字符强行变为合法。强制字符合法化例如,我们在命名一个函数名时,我们是不能使用纯数字或者空格来命名:但是我们可以通过反引号包.

2020-06-29 08:46:50 854 1

原创 快速上手 Kotlin 开发系列之比较对象

本节介绍 Kotlin 中对象的比较。Java 比较对象我们知道 Java 在比较对象的时候,是通过 == 来判断两个对象是否完全相同,通过 equals 方法判断两个对象的值是否相同:public static void main(String[] args) { String string = "string"; String newString = new Stri...

2020-04-13 22:43:19 995

原创 快速上手 Kotlin 开发系列之中缀表达式

本节介绍 Kotlin 的中缀表达式。通过上一节我们知道运算符的数量是有上限的,虽然跟随 Kotlin 版本迭代会有相应的变化但是对开发者而言还是固定的,因此当运算符不够的时候我就需要通过中缀表达式的形式去扩展我们所需要的逻辑。中缀表达式例如上一节提到的 step 关键字就是通过中缀表达式来实现的:fun main() { for(i in 1..100 step 20) {...

2020-04-12 11:32:28 398

原创 快速上手 Kotlin 开发系列之运算符重载

本节介绍 Kotlin 的运算符重载。在 Kotlin 中有非常多的运算符是通过重载来完成的,例如用于 String 拼接的 +,for 循环中的 ..。运算符重载我们看下面的示例,for 循环中遍历 1 到 100,其中的 .. 就是通过运算符的重载来完成的。step 是通过中缀来实现的,后面会介绍。fun main() { for(i in 1..100 step 20) ...

2020-04-08 23:07:23 159

原创 快速上手 Kotlin 开发系列之操作符

本节介绍操作符的实现原理以及一些常用的操作符。为了方便理解,我们把作用域函数和集合操作符统称为 Kotlin 的操作符。操作符的实现原理作用域函数与集合操作符的原理是完全一致的,这里以集合操作符作为一个例子来看整个作用域函数和集合操作符的运行原理。来看下这个 Kotlin 内置的操作符 forEach,它其实是对泛型为 T 的 Iterable 的一个扩展函数,其实内部就是执行了 fo...

2020-04-07 22:35:11 456

原创 快速上手 Kotlin 开发系列之作用域函数(1)

本节介绍 Kotlin 中的作用域函数。作用域函数是什么作用域函数是 Kotlin 内置的可以对数据做一系列变换的函数。它们与集合的操作符非常的相似,但是集合的操作符只能用于集合的数据变换,而作用域函数可以应用于所有对象,它可以对所有对象做一系列的操作。在 Kotlin 中常用的作用域函数有五个:run {...}with(T) {...}let {...}apply {...}...

2020-04-03 08:29:28 112

原创 快速上手 Kotlin 开发系列之集合操作符 (2)

本节接上一篇继续介绍 Kotlin 的集合操作符和如何自定义集合操作符。通过上一节 Rxjava 的示例,我们把同样的功能使用 Kotlin 来实现。Kotlin 示例附上整体代码:fun main() { val a = arrayOf("4", "0", "7", "i", "f", "w", "0", "9") val index = arrayOf(5, 3, ...

2020-04-03 08:26:36 182

原创 快速上手 Kotlin 开发系列之集合操作符 (1)

本节通过 RxJava 的集合操作引入 Kotlin 的集合操作符。如果大家有用过 RxJava 一定对操作符的概念并不陌生,RxJava 允许我们对数据做一系列的链式调用,在每一步中改变数据的格式,最终得到我们想要的数据。Kotlin 中原生的为集合添加了海量的操作符,基本上 RxJava 有的操作符 Kotlin 都会有语言层面的支持。先用 RxJava 实现一段链式调用,后面再使用 ...

2020-04-01 20:01:05 323

原创 快速上手 Kotlin 开发系列之循环

本节介绍 Kotlin 的循环语法。下面的示例是我们最熟悉的循环语法,但是这种语法在 Kotlin 中是不能使用的。不过没有关系,在 Kotlin 中有更多适合的语法供我们选择。以下列出 5 种 Kotlin 中常用的循环语法:常用的循环语法第一种,其中声明一个 i 用于迭代,之后 1…10 表示的是从 1 到 10 的闭区间(1 <= x <=10)当我们把循环 ...

2020-04-01 20:00:27 900

原创 快速上手 Kotlin 开发系列之解构

本节介绍 Kotlin 中特殊的数据拆箱方式:解构。解构在 Kotlin 中允许直接将一个类拆解之后并分别赋值,就像示例中的 User 对象一样,可以赋值给一个拆解开的 age 和 name 变量。解构的格式固定,val/var 括号后的第一个值与 User 类中的 component1 方法对应,相应的第二个值与 component2 方法对应,且都需要使用 operator 关键字...

2020-03-30 23:13:02 379

原创 快速上手 Kotlin 开发系列之数据类和枚举

本节讨论 Kotlin 的数据类、枚举类和密闭类。数据类数据类是 Kotlin 中很特殊的一种类,它可以将我们类中的成员变量自动的生成 getter/setter 方法,以及我们经常需要重写的 toString()、hashCode()、equals()、copy() 方法,而不需要像 Java Bean 一样需要我们手动去重写这些方法。数据类的声明只需要在类的前面添加 data 关键字...

2020-03-29 23:17:31 144

原创 快速上手 Kotlin 开发系列之动态代理

本节介绍 Kotlin 中没有反射的动态代理。Java 中的动态代理在讲 Kotlin 的动态代理之前先简单回顾下 Java 的动态代理,通过一个简单的例子说明下:首先,给出一个接口和其实现类:为了可以动态代理某个对象,我们实现 InvocationHandler 接口:通过 Proxy.newProxyInstance 方法创建代理对象,实现代理:Kotlin 中的动态代理...

2020-03-26 22:14:45 958

原创 快速上手 Kotlin 开发系列之伴生对象

本节将介绍 Kotlin 中的访问修饰符、伴生对象以及推荐单例的写法。访问修饰符在 Kotlin 中有四种访问符:publicprotectedprivateinternal前面三种有 Java 基础的读者肯定都比较了解。public 具有最大的访问权限,可以访问任意路径的类、接口、成员变量;protected 表示子类可以访问它修饰的父类成员变量;private 表示访问权...

2020-03-25 22:16:31 252 1

原创 快速上手 Kotlin 开发系列之构造函数

本节介绍 Kotlin 的类的声明以及构造函数类的声明在前面的文章中简单的介绍过类的声明,我们来回顾下。与 Java 类似,同样使用 class 关键字来声明一个类,后面紧跟着类名,如果该类有父类的话使用 : 分割,如果该类需要实现接口,则直接使用 , 跟在后面即可,而不是用 implement 关键字。接口和父类没有先后顺序。特别的,Kotlin 中如果没有显式的声明一个父类,那么它...

2020-03-25 22:01:00 630

原创 快速上手 Kotlin 开发系列之高阶函数和内联

本节讨论 Kotlin 高阶函数以及内联的使用高阶函数高阶函数就是指函数或者 Lambda 的参数又是一个函数或者 Lambda。通过下面示例简单的了解下。首先,高阶函数也是函数,所以同样需要使用 fun 关键字来修饰,示例中的高阶函数 onlyIf,需要接收两个参数,第一个参数为 Boolean 的变量,第二个参数是参数为空返回值为 Unit 的函数。其中 Unit 就是一个没有返回...

2020-03-23 23:41:56 233

原创 快速上手 Kotlin 开发系列之Lambda闭包

本节讨论 Kotlin 的 Lambda 闭包、以及它的声明和原理Lambda 闭包我们先看一个 Java 中非常常见的例子,就是创建一个子线程:我们知道 Java 8 也是有 Lambda 支持的,它可以把 Runnable 对象省略成一个 () -> 的表达形式。接下来,我们看下 Kotlin 的 Lambda 形式,与 Java 8 Lambda 类似,只不过 -&gt...

2020-03-20 09:59:41 280 1

原创 快速上手 Kotlin 开发系列之扩展函数

本节将着重介绍扩展函数Kotlin 中有一个非常大的优势,就是可以静态的给一个类扩展它的成员方法,以及成员变量扩展函数首先扩展函数也是一个函数,所以也需要 fun 关键字进行声明,后面紧跟着的是你需要扩展的类的类名, 比如示例中是给 File 类扩展一个成员方法,之后是一个 . 它用来分割类名和函数名,后面紧跟着的是扩展函数名,后面则与普通函数声明无异,参数、返回值以及函数体。下面我们看...

2020-03-19 08:21:17 1379

原创 快速上手 Kotlin 开发系列之函数与函数嵌套

在前面的文章中简单地介绍了 Kotlin 中函数的声明,本节将介绍 Kotlin 另外一种语法特性:函数嵌套函数语法函数声明即使 Kotlin 是一门面向对象的编程语言,它依然保留了函数这样的概念,不像 Java 中,仅仅只有方法。在开始前先回顾下函数的声明:在 kotlin 中以 fun 关键字表示我要声明的是一个函数,函数的参数与变量声明类似,变量名 : 变量类型,如果需要返回值...

2020-03-18 08:17:26 671

原创 快速上手 Kotlin 开发系列之与 Java 互调 (2)

本节将介绍 Kotlin 和 Java 互调过程中封装类、空值敏感以及静态变量和静态方法的处理Kotlin 没有封装类首先看看以下代码。我们用 Java 创建一个接口,如下:之后我们创建一个 A.java 实现这个接口,并在每个方法中打印对应的类型,int 和 Integer。最后,我们在 Kotlin 代码中调用它,我们来看下它的执行结果:你会发现只调用了 int 参数的...

2020-03-17 10:46:05 193 1

原创 快速上手 Kotlin 开发系列之与 Java 互调 (1)

学习完基础语法之后,我们来学习下 Java 和 Kotlin 互相调用的问题本节将介绍 Kotlin 与 Java 之间的语法变化Kotlin 文件中的函数首先让大家感到非常不适应的一点是,Kotlin 的函数居然可以直接写在文件中,而不用写在类中,但如果你知道 Kotlin 的代码编译以后依旧是 JVM 平台的一个 class,这一点应该就很好理解了。例如,我们在 Utils.kt ...

2020-03-16 14:14:30 252

原创 快速上手 Kotlin 开发系列之基础语法

为了能够跟进 Google 的脚步,Kotlin 成为当下 Android 开发的必备技能,从今天开始,我将从极客时间上学习的内容记录下来,方便未来查阅,该系列文章适用于有 Java 基础的开发者。我们从基础语法开始讲起IDE首先大家打开 IDE,注意我这里使用的是:Kotlin 文件创建一个以 .kt 结尾的文件,注意这是 Kotlin 的文件格式:var 和 val其中用...

2020-03-15 14:07:56 864

原创 手撸一个简单的网络框架

开始前网络访问框架关心的问题:能并发接受多个请求,并返回"用户"需要的数据重试机制实现方式:队列线程池网络框架实现步骤创建线程池管理类(队列,线程池)封装请求参数封装响应数据封装请求任务封装"使用工具"添加重试机制创建线程池管理类创建 ThreadPoolManager.java 类,负责管理请求队列和线程池//1. 创建队列,用来保存异步请求任务pr...

2019-02-26 11:05:49 415

原创 PowerMockito的使用

PowerMockito是单元测试mock必备利器,你值得拥有. 本篇内容讲述了使用PowerMockito的原因以及如何使用它的API.为什么Mockito不能mock静态方法这也许是我要使用PowerMockito最大的原因了,因为项目中有很多场景都会用到静态方法,举例来说各种Utils工具类,还有Activity的跳转工具类,在单元测试中偶尔要验证这些工具类的方...

2018-04-16 14:02:11 5802 4

原创 创建自定义的Espresso匹配器

本篇讲述通过BoundedMatcher 自定义了Espresso的匹配器.概述Android 提供了 BoundedMatcher 类用来创建针对特定 View 的 Espresso 匹配器. 详细内容请移步 : https://developer.android.com/training/testing/espresso/lists.html示例下面是...

2018-04-16 14:01:28 444

原创 通过Espresso测试异步代码

本篇讲如何通过Espresso实现异步测试.概述如果没有框架的支持测试异步代码还是非常具有挑战性的 ! 在 Espresso 之前典型的做法就是等待预定的时间.或者在测试代码使用 CountDownLatch 类的实例, 并在异步处理完成时发出信号. 而 Espresso 使得异步测试变得容易很多,因为它自动检测 AsynchronousTask 后面的线程池.它还监视用户界面...

2018-04-16 14:01:05 829

原创 Espresso的详细使用

本篇详细介绍了Espresso的使用方式.Espresso 测试代码位置和静态导入Espresso 测试代码必须放在 app/src/androidTest 目录下.为了简化 Espresso API 的使用, 强烈建议使用以下静态导入. 可以允许在没有类前缀的前提下访问这些静态方法.import static android.support.test.espres...

2018-04-16 14:00:23 5402

原创 初识Espresso

本篇内容介绍了Espresso框架的基本使用.Espresso测试框架介绍Espresso 是一个可以轻松编写可靠用户界面测试的测试框架.Google 于2013年10月发布了 Espresso 框架. 自2.0版本以来一直是 Android 支持库(Android Support Repository)的一部分.Espresso 会自动将你的测试操作与应用程序的用户界...

2018-04-16 13:59:56 1799

android_lrc_view

用于显示歌词的工具类

2016-06-10

AndroidLrcView

这是一个用于显示歌词的包,详情查看我本人博客

2016-06-10

ServiceDemo

我的博客《 Android四大组件之Service 》的源码 http://blog.csdn.net/u013144863/article/details/51377298

2016-05-19

空空如也

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

TA关注的人

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