自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 资源 (1)
  • 收藏
  • 关注

原创 从源码角度上分析常用的换肤原理(二)

目录1.原理简述1.LayoutInflater1.原理简述上篇说道外置资源文件的生成,可以和原来自带的资源文件使用两套Resources进行替换,对于新打开的页面可以根据标签对每个View进行判断并赋值,之前的页面会有无法更新的情况,并且对每个View都重写或主动调用相关的设置属性的方法会很麻烦。那么就得从根源上去处理View属性的创建和缓存的逻辑,就是说,从View的创建上入手,获取到相关的属性,用缓存存储相关页面的View属性信息,更换主题的时候通知所有的缓存中的View即可,当然这些View也

2020-08-03 22:23:30 302

原创 从源码角度上分析常用的换肤原理(一)

目录1.适用场景2. Resources1.适用场景所谓的换肤,更换主题,其实是对资源文件的替换,或者说使用额外的同id的资源文件进行更新;而换肤能操作的也只能是资源,比如颜色,图片,必须是应用中预先定义好id的资源类型。也就是说,换主题是要额外的外置资源插件,可以是apk文件,而这个插件中有和应用内相同id名称的资源文件。当需要更换主题时,去加载这个插件,得到一个新的Resources对象(这个和原应用的进行区分,同时保留,根据特定的id名称进行查找替换), 重新加载或刷新页面,如果有插件中同名的资

2020-08-02 14:39:15 392

原创 从零开始的ThreadPoolExecutor源码解析

目录1.基本参数ThreadPoolExecutor在我们日常操作中经常使用,常见的那些使用基本使用方法和就不说了,这篇分析一下基本源码(其实是因为源码比较少)1.基本参数首先看一下定义的基本参数 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); private static final int COUNT_BITS = Integer.SIZE - 3; private static

2020-07-16 10:59:08 234

原创 从实战开始的NestScrolling学习

目录1.开篇2.实战1.开篇网上相关的NestScrolling介绍有很多,而NestScrolling本身也是很简单的,说白了就是几个接口,里面定义了很多方法,而这些方法需要我们自己传递和处理。我们平常能使用NestScrollView和ReyclerView等进行嵌套滑动,这些都是官方已经帮我们把接口处理完毕了本篇打算自己实现接口完成简单的Demo练习,而不借助NestScrollView等已经实现接口的View的继承,用最基本的几大布局来实现如下的效果2.实战上面看起来很复杂,其实说白了

2020-07-12 16:45:36 491

原创 Android那些“没用“知识(一)

目录1. addOnPreDrawListener1. addOnPreDrawListeneraddOnPreDrawListener方法是

2020-07-02 20:22:49 1300 1

原创 kotlin常见的高阶函数用法(一)

目录1.基础回调1.基础回调kotlin支持把函数方法作为参数传递,而回调接口的定义不需要和java一样单独定义一个interface,可以随时定义随时使用fun method1(targetBoolean: Boolean, targetMethod: (String) -> Unit) { if (targetBoolean) { targetMethod("成功"); } else { targetMethod("失败") }}

2020-06-29 01:38:28 548

原创 Jni的两种调用使用方式

目录1.配置信息2.静态方式调用3.动态方式调用1.配置信息本篇博客用的是CLion去做c代码的编写,因为用的是Windows系统,最终会编库译成dll格式的库文件,然后去使用AndroidStudio去运行Java代码,引入这个库文件,实现双向的简单交互,本质和用AndroidStudio生成so文件是类似的,只做演示处理先是在CLion的CMakeLists中添加库的声明add_library(jnitest-lib SHARED test/testJni.c test/com_learn_jn

2020-06-16 21:35:41 1833

原创 安卓app加固的简单实现

目录1.app加固原理2.简单的加固处理1.app加固原理我们在用360加固的时候,会发现目录结构变成了这种格式会发现我们自己的代码完全看不见了,而这里会多出一个Application就是StubApp,在这个StubApp中会去加载360的so文件,然后我们的应用就可以正确执行了。并且Mainfest中Application名会修改为StubApp <application android:name="com.stub.StubApp" android:al

2020-06-08 02:15:27 6004 1

原创 Kotlin的那些List相关的操作符

目录1. all2.any3.count4.none5.fold1. all判断list中所有的元素的限定条件,如果全部满足则返回trueval list = listOf<Int>(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)var all = list.all { it >= 0 }println("all -> $all") //打印 all -> trueall = list.all { it >10}println("all -

2020-06-05 01:23:24 2721

原创 Gson的那些常见使用方法你都知道吗

目录1.什么是Gson2.转换的基本用法1.什么是GsonGson是google提供的一种基于Java的工具库,可以把Java对象转化为Json字符串,也可以把Json格式的字符串转化为Java对象。而Json常用于网络数据结构的传输,H5的数据操作也经常会用到json的数据结构2.转换的基本用法说起转换,我们经常用到的两个方法是toJson和fromJson,一个是把对象转成json字符串,一个是把json字符串转成对象。然而对于Gson来说,能转换的并不是严格要求是完全正确的,或者说是格式良好

2020-05-28 00:44:34 801

原创 Serializable的那些事

目录1.Serializable是什么2.Serializable的使用3.序列化的基本操作4.serialVersionUID的作用5.ObjectStream的一点思考6.Externalizable7.Serializable的扩展1.Serializable是什么serializable是一个对象序列化的接口,一个类只有实现了Serializable接口,那么由它所创建的对象才可以被序列化。那什么是序列化呢?通常我们对于多种复合的属性会用一个对象去包装,就是一个对象会拥有多种成员属性,而这些属

2020-05-23 19:14:11 579

原创 ThreadLocal的那些事

目录1.什么是ThreadLocal2.ThreadLocal的基本使用3.ThreadLocal的实现原理1.什么是ThreadLocalThreadLocal是一种线程的变量副本,给每个调用的线程提供单独的变量属性,各个线程间的副互不干扰。对于线程内的局部变量我们一般会怎么定义?我们一般会在线程内建立一个变量的声明,然后通过构造方法或者set方法把需要的变量值传进去,ThreadLocal方法则帮我们处理了这一过程,设置局部变量的操作可以在线程外执行,设置用法可以认为和我们常用的set的实现效果差

2020-05-17 17:13:51 312

原创 Java之代理相关

目录

2020-05-17 01:58:36 271

原创 Java之反射相关

目录

2020-05-11 00:09:07 240

原创 Java之注解相关

目录1.注解介绍1.注解介绍

2020-05-10 19:53:32 403

原创 Java之泛型相关

目录1.泛型介绍2.泛型的类型检查1.泛型介绍泛型(Generic)是在JDK5引入的新特性,提供了编译时类型安全的校验机制,可以在编译期发现类型错误,提高了代码的类型安全性,并且编译期的错误修复比运行期的错误容易的多,给开发也提供了便利;泛型的本质是参数,可以定义在类,接口和方法中,也就是说指定操作的数据类型为参数类型,和方法的形参有些类似,不同的是形参传入的是具体值,而泛型传入的是一个类...

2020-04-25 20:34:44 255

原创 ViewModel简要分析

目录1.使用2.分析1.使用ViewModel通常用于在页面做数据持久化,可以避免横竖屏切换等场景造成的数据丢失通常我们处理这种场景会在onSaveInstanceState进行数据的临时存取,而ViewModel则直接可以简化这种操作使用方法很简单,这样就可以创建一个ViewModelvar viewModel = ViewModelProvider(this, ViewModelP...

2020-04-15 04:27:47 896

原创 Paging流程分析

目录本篇分析的是paging版本2.1.1的流程因为jetpack目前更新频率较快,可能过几周这部分代码会有变动上篇的例子中的ViewModel创建方法为class PersonViewModel : ViewModel { private var liveData: LiveData<PagedList<Person>> constructor...

2020-04-13 02:35:52 1107

原创 WorkManger流程分析(一)

目录1.初始化2.执行任务本篇分析的是WorkManger版本2.3.1的流程因为jetpack目前更新频率较快,可能过几周这部分代码会有变动1.初始化private fun test(){ WorkManager.getInstance(this) .enqueue(OneTimeWorkRequest.Builder(Worker::class.java) .build...

2020-04-12 13:26:09 908

原创 jetpack之WorkManager的使用方法

目录1.配置信息2.使用方式2.1 定义Worker2.2 创建WorkRequest2.3 执行任务3.拓展3.1 WorkRequest3.2 约束3.3 Worker3.3 批次任务3.3.1 串行执行任务jetpackd的WorkManager可以用来处理后台任务本篇介绍jetpack的WorkManager的基本使用方法1.配置信息 def work_version = "2...

2020-04-11 19:59:19 554

原创 jetpack之Paging的使用方法

目录1.配置信息2.实现方式2.1 定义数据源对象2.2 定义DataSourcejetpack的paging是用来处理分页数据加载的一环本篇介绍jetpack的paging的基本使用方法1.配置信息def paging_version = "2.1.1"implementation "androidx.paging:paging-runtime:$paging_version" /...

2020-04-09 01:20:01 1100 2

原创 力扣算法做题日记之《位运算》01

目录1.将数字变成 0 的操作次数2.二进制链表转整数3.二进制中1的个数4.最大数值以下算法题均来自leetCode题库 https://leetcode-cn.com/1.将数字变成 0 的操作次数给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。class Solution { //正数变...

2020-04-07 00:07:24 356

原创 Kotlin的那些小知识

目录1.可空类型2.延迟初始化3.非空断言4.可空断言5.懒加载6.匿名内部类7.方法上下文不定期更新,记录自己使用中常用的方法1.可空类型var test:String?=null声明变量时候指定可空声明,非空类型则必须赋初始值2.延迟初始化lateinit var test:String声明变量在之后的流程中赋值,不能为空3.非空断言var test: String? =...

2020-04-06 16:26:11 358

原创 RoomDatabase的使用方法

目录1.配置信息2.使用方法1.配置信息详情参照官方文档 def room_version = "2.2.3" implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" // For Kotlin use kapt ins...

2020-04-05 20:48:16 3855

原创 DataBinding流程初探

1.使用方法创建一个布局文件<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> ...

2020-04-02 10:58:57 613

原创 Aspect基础使用方法

所谓切面编程,就算将一个完整的流程切分成若干个,然后主流程只关心调用的方法,而不关心具体的实现逻辑,而子流程在完成业务逻辑后会把通知主流程方法继续向下执行或者通知失败;说白了就是方法的拦截操作,可以在方法执行前后进行一定的处理,然后根据需求判断是否是真正进入执行该方法或是直接跳过该方法抛出异常之类的,可以类比成OkHttp的拦截器Aspect是一个实现切面编程的框架,本篇介绍一下Aspect的...

2020-03-29 23:32:45 2249

原创 LifeCycle源码解析

LifeCycle基本使用1.1.声明一个监听的观察者,这里方法最多支持两个参数,且只有Any类型可以有两个,其他类型最多只能有一个参数,而且参数类型都固定,不可以定义其他类型const val MTAG = "MLifeCycle"class MLifeCycle : LifecycleObserver { fun log(msg: String) { L...

2020-03-29 00:51:00 459

原创 LiveData源码解析

LiveData作为jettpack的一环,常搭配ViewModel一起使用;相比于RxJava,用LiveData封装的LiveDataBus更加简洁方便,并且LiveData会感知页面的信息变化,当页面是不可见的时候,及时Data有数据更新,页面也不会接收到,然后在页面重新可见再去把数据通知给页面,而且在页面销毁时也会及时销毁数据,大大降低了内存泄露的发生;这篇主要简单分析一下LiveData...

2020-03-27 12:04:51 404

原创 javapoet实现的Butterknife的view注入功能

1.配置信息1.1 创建一个java-library用于存放注解的类新型[:annotion]apply plugin: 'java-library'然后创建一个用于绑定View的注解,指定为编译时注解类型,用于Filed的注入类型@Target({ElementType.FIELD})@Retention(RetentionPolicy.CLASS)publi...

2020-03-24 18:27:30 287

原创 注解实现EventBus功能

核心还是反射,注解相关的好像都需要通过反射去处理实现思路:1.定义一个Map集合存放注册EventBus的对象,以及该对象注册的事件方法和参数2.注册时去遍历获取该对象符合条件的注解属性,并存到步骤1的集合中3.发送事件时,遍历步骤1创建的集合,判断发送事件的Object对象类型,如果集合中有该对象类型或者该对象类型的父类,则认为是匹配的,这时候的key就是实际注册的Activi...

2020-03-23 11:12:13 348

原创 注解实现Butterknife注入功能

注解的核心是反射,就是定义了注解参数后,通过注入方法获取到注入的对象,查找相应的属性,如果包含注解信息,则可以拿到相应的value等属性,比如Filed属性 ,最终会通过field.invoke(obj1,obj2)反射设置值,最终实现属性值的设定1.注入View定义一个view的注解,周期指定运行时,Filed属性@Target(ElementType.FIELD)@Reten...

2020-03-23 10:40:38 275

原创 Rxjava的基础用法和源码解析(三)

这篇博客的用法主要有: zip,amb,combineLatest ,concatEagerzippublic static <T1, T2, R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, final Func2<? su...

2020-01-31 00:26:04 306

原创 Rxjava的基础用法和源码解析(二)

这篇博客的用法主要有:lift , map ,merge ,concatliftpublic final <R> Observable<R> lift(final Operator<? extends R, ? super T> operator)这个方法算是rxjava中比较核心的方法,后面的map,flatmap等都会用到这个模块,看一...

2020-01-29 22:07:50 409

原创 Rxjava的基础用法和源码解析(一)

打算从这篇博客开始整理一下Observable的那些api用法这篇博客的用法主要有:just , from,interval, timer, range, never, empty, error, deferjustpublic static <T> Observable<T> just(final T value)public static &lt...

2020-01-28 21:56:00 447

原创 RxJava的Observable创建和发布流程原理简单分析

Rx框架从发布以来已经被越来越多的人所认可,尤其是其类型转换和线程自由切换可以大大减少代码的回调层数,使代码可读性大大提高我们先看一个例子 Observable.just("1") .map(new Func1<String, Integer>() { @Override ...

2020-01-27 21:46:56 556

原创 Android使用ViewDragHelper实现简单的view拖拽和吸边功能

工作了几年,最开始做的是安卓开发,后面的做了一段时间逆向和sdk开发,一直没有系统的整理自己的知识,打算从本篇博客开始,陆续复习并记录一下自己的安卓知识一直不知道怎么排版,先凑合着弄下实现效果,gif上传被压扁了ViewDragHelper的用法viewDragHelper是一个安卓自带的处理拖拽的工具先看一下viewDragHelper的创建步骤 public...

2020-01-25 00:37:38 3231 1

ZeroViews.zip

关于NestedScrollingParent,NestedScrollingChild ,自定义Behavior 学习的Dmeo

2020-07-12

空空如也

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

TA关注的人

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