- 博客(41)
- 资源 (7)
- 收藏
- 关注

原创 深入剖析Glide源码-4.15版本(二)
首先我们来了解一下Glide的注册机Glide初始化时,会通过注册机注册一系列的图片加载对象,如果传入String,那么会从String.class注册的类中进行加载,同理,如果传入了一个file,那么它将从File.class注册的一系列的类中进行遍历,找到合适的进行加载。那么我们继续来看链式调用中的方法。以传入String为例,返回了对象,其实就是调用了方法事实上,无论load方法中传入的是String,还是Bitmap,或是Uri等等,最终都会调用到方法,然后返回了自身,这里给属性进行了赋值,其
2023-03-30 15:29:04
1130
1

原创 深入剖析Glide源码-4.15版本(一)
Glide作为android中最主流的几个图片加载框架之一,是面试中问到的必不可少的一种框架。它看似简单的外表下,实则隐藏着一个庞然大物,今天我们就把块硬骨头啃上一啃~。glide在4.15版本生命周期管理与注册机管理进行了改进,我们从4.11版本开始看,流程读懂了再研究4.15版本是如何演化的。
2023-03-13 21:54:31
824

原创 C基础-入门
C基础-入门不得不说学习C/C++将是一个噩梦般的过程,不过学习带来的成果也是不可估量的,下面我们使用jetbrins的clion开发工具,重学C/C++。环境配置CLion的安装这里就不多说了,这里提一下,mac如果安装了XCode就不需要配置什么了,如果是Windows系统,需要安装Cygwin,在下面红框处配置Cygwin环境即可。Hello World新建项目环境配置完成后,新建一个项目可以看到,左侧菜单栏有很多选项C++ Execuable:创建一个C++项目C++ Lib
2021-02-24 10:38:09
501

原创 OKHttp拦截器-请求服务器拦截器
**CallServerInterceptor**请求服务拦截器,这是OKHttp最后一个默认的拦截器,当与服务建立好连接之后,就可以进行真正的网络请求了。利用exchange发出请求到服务器并且解析生成Response@Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { val realChain = chain as RealInterceptorChain
2020-12-30 15:37:06
713

原创 OKHttp拦截器-连接拦截器
这是OKHttp的第三个拦截器 - ConnectInterceptor,如果缓存判定失败,就会走到这里进行真正的网络连接了。连接池连接池是对网络连接的一种优化,当需要与服务进行连接的时候,会线程连接池里面查找有没有闲置的连接,如果有那么就直接使用,否则就重新创建一个连接并放入连接池。constructor() : this(5, 5, TimeUnit.MINUTES)constructor( maxIdleConnections: Int, keepAliveDuration:
2020-12-30 14:22:15
657

原创 OKHttp拦截器-缓存拦截器
CacheInterceptor,OKHttp第三个执行的拦截器就是缓存拦截器了,在发出请求前,判断是否命中缓存。如果命中则可以不请求,直接使用缓存的响应(只会存在Get请求的缓存)。这里内容比较多,大家做好心理准备哦~总体流程老规矩,先来看一下拦截器的CacheInterceptor#intercept()方法:@Throws(IOException::class)override fun intercept(chain: Interceptor.Chain): Response { val
2020-12-30 10:06:53
1612
2

原创 OKHttp拦截器-桥拦截器
BridgeInterceptor, 桥拦截器,连接应用程序和服务器的桥梁,我们发出的请求将会经过它的处理才能发给服务器,比如设置请求内容长度,编码,gzip压缩,cookie等,获取响应后保存Cookie等操作。这个拦截器相对比较简单,它作用是补全请求头。请求头在客户端与服务器通信的过程中,需要携带一些其他的报文,有一些是必须的,在浏览器中我们可以查看请求头:请求头是以key:value的格式发送的,多个请求头之间用换行隔开,这样服务端将会通过固定的格式对头进行解析。其中常见的请求头有 :
2020-12-29 13:10:44
224

原创 OKHttp拦截器-重试和重定向拦截器
经过上一篇的解析,我们已经对OKHttp的同步请求和异步请求了然于胸,还有五大拦截器可以说是它的画龙点睛之笔,今天我们就来看看,它们是怎么运作的。RetryAndFollowUpInterceptor,顾名思义,用来处理请求失败后重连和重定向的,上一篇我们知道了责任链调用的是intercept()方法:@Throws(IOException::class)override fun intercept(chain: Interceptor.Chain): Response { val realCha
2020-12-25 13:39:22
1523
1

原创 网络编程基础之OKHttp源码理解-kotlin版(一)
前几篇文章讲了网络的基础,包括网络分层,三次握手 ,socket,TCP/IP和UDP协议等,我们知道了阻塞式IO(BIO)和非阻塞式(NIO)通信的原理,现在就从底层出发,一起来探究下OKHttp的原理吧。OKHttp是什么OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofifit框架底层同样是使用OKHttp的。优点:支持H
2020-12-24 16:24:20
600
2

原创 从零开始实现一个插件化框架(一)
从零开始实现一个插件化框架(一)什么是插件化概念插件化技术最初源于免安装运行 apk 的想法,这个免安装的 apk 就可以理解为插件,而支持插件的 app 我们一般叫宿主。宿主可以在运行时加载和运行插件,这样便可以将 app 中一些不常用的功能模块做成插件,一方面减小了安装包的大小,另一方面可以实现 app 功能的动态扩展。我们知道计算机主板就是由一系列的插槽组成的,我们需要什么功能...
2020-01-12 15:57:07
2437
1

原创 MMKV的原理与实现(一)
MMKV的原理与实现(一)说到轻量级的数据持久化,大家最先想到的就是SharedPreferences(以下简称SP)了,SP存储方式为xml,直接使用I/O流进行文件的读写,这就形成了一个弊端:每次写入或修改都需要替换掉原来的数据,并将所有数据 重新写入文件。可想而知,如果一个sp文件的内容过多,那么再写入的时候会造成卡顿,甚至会有 ANR的风险。一、I/O1、先看一下SP的工作原理虚...
2019-12-25 17:49:12
5557
1

原创 Android仿京东、天猫的筛选列表
itemStatus.mViewType = ItemStatus.VIEW_TYPE_SUB_ITEM itemStatus.mGroupItemIndex = i - 1 // 指定的position组索引 val subSize = mDataListTrees[i - 1].sub!!.size // 计算指定的position前,统计的列表项和 val temp = it
2019-01-24 13:28:14
6011
3
原创 androidstudio 升级到了2020.3.1以后的版本,debug中文乱码(方框)
androidstudio 升级到了2020.3.1以后的版本,debug中文乱码(方框)的解决办法
2022-01-12 10:04:01
427
原创 JAVA并发 - 基础(二)
JAVA并发 - 基础(二)补充1. 守护线程上一篇讲解了创建线程的几种方式,以及线程中常见的几个方法,在进行回顾的时候发现忘记了一个方法setDaemon()线程一般分为用户线程和守护线程,线程创建默认是用户线程,可以调用thread.setDaemon(true)方法将线程设置为守护线程。用户线程 - 当jvm运行结束后,线程不会结束,会一直等到程序执行完才会进入死亡状态守护线程 - 当跟随jvm一起结束,并不一定会等到任务全部执行完毕下面我们来看一段代码:public class
2021-09-20 22:44:52
199
1
原创 Android组件化方案(二)-基于kotlinpoet实现的注解处理器(重磅干货)
前情回顾上一篇文章我们主要讲的gradle的统一管理,组件之间的通信方案,以及如何使用全局map进行页面跳转。每个页面都需要在application中进行注册,这样肯定是不行的,根据面向对象的思想, 我们先对其进行一层封装,做到在编译器自动进行注册。封装全局Map首先我们将通信方案作为一个组件,创建一个irouter_api的module,由base去依赖它,然后把RouteBean实体类挪进来,为了方便以后扩展,我们在RouteBean中增加几个属性class RouteBean { /
2020-12-07 11:02:55
2688
原创 Android组件化方案 (一)
什么是组件化组件化的工作方式信奉独立、完整、自由组合。目标就是尽可能把设计与开发中的元素独立化,使它具备完整的局部功能,通过自由组合来构成整个产品。将每个业务模块分成单独的组件,可单独打包、测试,这种方式能够让我们的项目具有更高的可维护性和可读性。为什么需要组件化我们在一些中大型的项目中可以看到,他们少则几个,多则几十个,甚至上百个组件,为什么这样做呢?在早起的项目中,都是单一的模块,进行业务分包的模式开发的,这样随着项目增大,项目失去层次感,维护起来越来越棘手。再一个就是耦合度太高,稍不注意就有不同
2020-11-27 16:47:50
579
1
原创 从零开始实现一个插件化框架(四)-补充篇
系列文章从零开始实现一个插件化框架(一)从零开始实现一个插件化框架(二)从零开始实现一个插件化框架(三)好久没写过文章啦,始终有一股深深的罪恶感。插件化系列的文章我前三篇已经介绍完了原理.从加载插件类---->加载四大组件并跳转 ----> 资源加载 ----> android10以下版本适配四个大步骤,我相信大家都已经有所了解。不过还是有不少小伙伴在问我android10如何适配,如果同学们看了第三篇文章,我相信适配android10也是易如反掌的,毕竟只是 api的变动嘛!
2020-10-21 17:01:20
565
1
原创 Google组件化方案 - AutoService
Google组件化方案 - AutoService市面上的组件化通信框架可谓是眼花缭乱,参差不齐。像阿里的ARouter, 美团的WMRouter, 还有个人开发者提供的CC框架,他们各有优缺点。今天我们介绍一款轻量级的组件化通信框架,谷歌的亲儿子 - AutoService。使用篇项目结构在Android项目架构中,最底层一个Base层,然后是Common,所有的业务模块都依赖Common层,app被称为壳工程,它依赖所有的业务模块。图很简陋,但整体就是这样一个结构了。我们就以一个简单的de
2020-08-25 17:14:04
10624
6
原创 剖析RecyclerView的回收与复用
同学们面试中有没有经常被问到RecyclerView的回收复用逻辑呢?是否又跟我一样一脸懵逼?今天我们就从源码的角度入手,扒开RecyclerView的“神秘面纱”,让面试官都见鬼去吧!回收复用何谓回收与复用呢?RecyclerView在滚动时,会将滑出屏幕外的View进行一个缓存,这就是ViewHolder的回收,从屏幕外面滑进来的ViewHolder呢,会从缓存中取ViewHolder,如果有缓存没有,那么就进行创建,如果找到了就进行复用。所以准确的应该说是ViewHolder的回收与复用。Vie
2020-08-08 20:29:10
1951
2
原创 深入理解Android自定义View(一)
Android自定义View - 一前言View绘制流程viewGroup.addView()requestLayout()onMeasureonLayoutonDraw流程图requestLayout()流程performLayout()invalidate()自定义View基础View介绍View分类View坐标系View坐标描述View触摸事件获取位置View的视图结构View构造函数View自定义属性测量(MeasureSpec)测量模式MeasureSpec介绍总结前言有多少小伙伴和我一样,一
2020-07-31 14:50:48
888
原创 CameraX 库打开手电筒的两种方式
CameraX 库打开手电筒好久没有写文章了,罪过,这几个月一直很忙,都没有时间进步了。。。最近新开发一个项目,正好拿google的jetpack组件练练手,于是就集成了CameraX。里面很多坑啊,都在度娘的帮助下解决了。不过还有一个问题,google和度娘都帮不了我了,在此记录一下:CameraX 库怎么打开手电筒?其实有两种方法这种方式很简单: 官方demo里面获取到了camera对象,注意是androidx.camera.core.Camera包下面的,可以利用这个对象来控制手电筒:
2020-06-18 16:44:05
3362
原创 Java并发 - 基础(一)
什么是线程在面试中,经常会问到:进程和线程的区别。在了解线程之前,首先要了解什么是进程。进程是操作系统进行资源分配和调度的基本单位,当运行一个程序时,就是开启了一个进程。线程是进程中的一个主体,一个进程至少有一个线程(也就是主线程),进程中的多个线程可以共享进程的资源。当执行一个程序时,CPU的资源会分配给线程,所以线程是CPU进行资源分配和调度的基本单位。CPU核心数和线程数最早前的电脑都是单核单线程的,也就是一个核心处理器对应一个线程去工作。后来慢慢出现了多核心技术和超线程技术。多核心技术已经
2020-05-13 16:16:45
251
原创 一、初识Flutter
文章目录Flutter是什么跨平台开发Fuchsia移动端开发历程第一阶段:原生开发第二阶段:H5第三阶段:跨平台框架(RN)FlutterFlutter架构Flutter发展史Flutter特点和优势特点优势ShowcaseDartDart特点JIT 和 AOT总结Flutter是什么官方文档介绍:Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面...
2020-05-06 13:46:59
754
原创 你真的了解泛型吗?(二)
@TOC通配符上一节讲到通配符,已经把大部分的使用场景都梳理了一遍。当然,使用通配符还有一些需要注意的地方。通配符捕获和帮助方法在某些特定场景,编译器会自动推断通配符的类型。比如,一个List,在使用它具有泛型类型的方法时,就会从代码中自动推断出特定的类型 。这种情况称为通配符捕获。以下示例编译时将会报错:(参数不匹配)List<?> foo = new ArrayList...
2020-04-28 11:19:54
302
1
原创 你真的了解泛型吗?(一)
一、java泛型(一)如果本文满足不了大家对泛型的理解,可以自行参考官方文档英文文档:https://docs.oracle.com/javase/tutorial/java/generics/index.html中文文档:https://pingfangx.github.io/java-tutorials/java/generics/rawTypes.htm什么是泛型泛...
2020-04-23 19:49:34
347
原创 IOC依赖注入(一)— 手写ButterKnife框架
IOC控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,其中最常见的就是依赖注入(Dependency Injection, 简称DI)依赖注入现在市面上越来越多的开源框架使用了依赖注入技术。什么是依赖注入呢?其实就是使用注解的方式去实现某些功能。比如:1.运行时注入 xUtils,eventBus,springMVC2.源码时注入 ...
2020-02-24 14:04:44
691
原创 从零开始实现一个插件化框架(三) - 完结篇
系列文章从零开始实现一个插件化框架(一)从零开始实现一个插件化框架(二)往期回顾Activity的启动流程上两篇文章讲了插件apk中的类加载和Activity跳转,那么面试中经常问到的Activity的启动流程是不是就有了答案?Activity的启动过程,我们可以从Context的startActivity说起,其实现是ContextImpl的startActivity,然后内部会通过...
2020-01-21 17:01:29
1420
4
原创 从零开始实现一个插件化框架(二)
从零开始实现一个插件化框架(二)上一篇讲了插件化的概念和类加载机制,并实现了从插件apk中合并,并加载一个类。不知道大家还记不记得,实现插件化,只需解决三个问题即可:如何加载插件中的类?如何加载插件中的资源?当然还有最重要的一个问题,四大组件如何调用呢?四大组件是需要注册的,而插件apk中的组件显然不会在宿主提前注册,那么如何去调用它呢?第一个问题在上一篇文章中已经实现,今天我们就来...
2020-01-20 16:16:07
1688
原创 MMKV的原理与实现(三)
MMKV的原理与实现(三)MMKV多线程设计1. C/C++中的线程:POSIX线程POSIX,全称为可移植性操作系统接口。它包括了系统应用程序接口(简称API)。该标准的目的是定义了标准的基于UNIX操作系统的系统接口和环境来支持源代码级的可移植性,致力于提供基于不同语言的规范。POSIX的线程标准,定义了创建和操纵线程的一套API。2. 基本使用#include <iostre...
2020-01-07 17:49:09
2275
原创 MMKV的原理与实现(二)
MMKV的原理与实现(二)上一篇讲了MMKV的存储原理以及protobuf编码的规则,并以一个整数的编码规则举例。今天我们就从 MMKV的源码来剖析它具体是怎么实现的。页上次简单的提了一下页的概念,在Linux中,数据都是以分页的形式保存的,32位系统中,一页就是1024个字节,MMKV在初始化文件的时候,给文件分配了一页的大小,后面根据修改后的数据大小再进行动态扩容,每次翻一倍。负数编码...
2019-12-28 15:50:34
2460
原创 简单的封装通用的toolbar
本篇讲解如何简单的封装toolbar,用到了builder设计模式,使用起来也非常方便。看看是怎么封装的吧!首先创建一个toolbar布局文件:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
2019-12-16 17:31:11
378
1
原创 android-揭秘热修复黑科技(二)- Tinker
android热修复方案二- Tinker上一节讲了各个热门的热修复框架的机制和Tinker热修复的原理,但是还是有一些坑存在的。让我们来看看都存在哪些坑,Tinker框架又是怎么填补的呢?一、android 19 及以下的手机修复失败或报错1.1按照上一节的内容做实验,可以测试出android5.0及以上的手机是没有问题的,可以修复成功,但是在android4.4的手机上运行时修复失败了...
2019-12-13 14:13:56
376
原创 android-揭秘热修复黑科技
android热修复方案热补丁方案有很多,其中比较出名的有腾讯Tinker、阿里的AndFix、美团的Robust以及QZone的超级补丁方案。他们的优劣如下:一、Tinker 热修复Tinker通过 Dexdiff 算法将原apk和修复后的apk中的dex文件进行对比,生成差分包,运行时将差分包中的dex和原包中的dex进行合并,从而加载差分包中修复好的类。因为是运行时加载的dex文件,...
2019-12-03 16:20:56
858
原创 JNI静态注册方式
静态注册实现首先在JAVA中声明一个本地方法: public class Register { public native String HelloWorld(); }编译java文件:在终端中执行以下命令: javac Register.java 将会生成一个Register.class的字节码文件编译头文件: javah Regist...
2019-11-21 15:09:58
340
原创 JNI与NDK基础入门
JNI简介一、简介1. 什么是JNI2. JNI定义二、NDK是什么1.定义2.特点三、JNI和NDK的关系1. NDK是Android中实现JNI的手段四、JNI动态注册和静态注册1. 静态注册2. 动态注册静态注册实现一、简介1. 什么是JNIJNi就是java调用本地方法的技术,最简单的来说,java运行一个程序需要要和不同的系统平台打交道,在windows里就是和windows平台底...
2019-11-21 15:08:13
537
原创 项目迁移到Androidx,在低版本手机运行时,Checkbox设置button为null不起作用
记录项目迁移到androidx的一个坑 androidx是goggle对support包进行了整合的一个库,用来替代support,而google也会逐步放弃对support库的升级和维护,所以我们项目再不久前就进行了迁移。 &nb...
2019-10-29 20:14:25
1489
原创 使用Rxjava + retrofit + okhttp + mvp封装·高度自由定制的网络请求
网上找了很多网络请求封装的demo,但是由于种种局限,都没有真正适用于自己项目中的,于是自己实现了一个高度可自由定制的网络请求加载框架什么是自由定制?比如可自定义是否显示加载框、加载框样式自定义、是否缓存本次请求,缓存条件自定义、自定义缓存方式、可自定义拦截器、自定义BaseUrl等等(以上功能框架中均有默认实现,也可自由定制)github:https://github.com/plumco...
2019-09-03 12:52:14
559
转载 Android开源库SlideMenu如何实现沉浸式效果
SlideMenu是一个在Android上被广泛使用的开源库,它是一个仿照IOS左滑菜单开发的类似效果。 SlideMenu开源库GuiHub地址如下: SlideMenu GitHub在项目中导入SlideMenu有两种方式,一种是将SlideMenu作为Library库,然后在自己的项目中右键点击Properties–>android–>在右下方Library选项将开源库添...
2017-03-03 20:17:33
305
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人