
android架构师
文章平均质量分 89
架构师学习
qinbin2015
坚持就是胜利
展开
-
动态权限申请框架
API 23之前的版本都是自动获取权限,而从 Android 6.0 开始添加了权限申请的需求,更加安全。并且目前android系统已经发展到10.0,加上国家对用户隐私的保护,了解这一技术不可避免。google也为我们提供了RxPermission这一框架RxPermission,有兴趣的可以自行了解。本文将采用AspectJ的方式实现。一、AspectJ集成1、工程的build.gradl...原创 2019-12-31 13:38:15 · 741 阅读 · 0 评论 -
架构师学习--butterknife原理解析
之前有介绍过IOC实现布局、控件、事件的运行时注解。里面使用了大量的反射,难免会影响性能。显而易见,我们常用的butterKnife并没有使用这种技术,而是使用了APT技术,编译时完成这些操作,这样和原始性能相差无几,不过这样会增加apk的体积。下面将学习它的实现原理。一、使用1、gradle配置加入以下依赖// 依赖库 implementation 'com.jakewharto...原创 2019-10-09 16:50:57 · 291 阅读 · 0 评论 -
架构师学习--IOC方式实现布局、控件、事件依赖
项目中通过findViewById方式来初始化控件显得代码很臃肿,并且类之间的耦合度很高。为了解决这个问题,有两种方式可以实现:IOC:反射+注解方式,运行时处理APT:比如butterKnife,编译期处理下面将用IOC的方式实现布局控件的运行时注解。一、布局注解1、创建布局注解类@Target(ElementType.TYPE)@Retention(RetentionPoli...原创 2019-10-09 14:40:07 · 177 阅读 · 0 评论 -
架构师学习--rxjava线程切换
比如有这么一个需求:网络上下载一张图片,然后显示在界面上。常规的做法可能就是开一个子线程负责网络图片的下载,得到图片后,通过Handler发送到UI线程进行界面的更新。这样写,当然也没有问题,但是,这样会显得代码四分五裂,可读性不是很强。但是通过rxjava的链式调用以及线程切换,这样的需求同样能够实现,并且代码的阅读性很强。一、线程模式1、四种线程模式Schedulers.io(): ...原创 2019-09-27 10:42:50 · 311 阅读 · 0 评论 -
架构师学习--rxjava背压模式
什么是背压模式,在rxjava1系列是没有背压模式的,但是在rxjava2中加入了背压。那是因为在rxjava1中,如果上游不停地发射,下游处理不过来(阻塞),就会出现内存泄漏。为了解决这个问题,就引入了背压。背压的上游被观察者是Flowable,下游观察者是Subscriber。使用方式和Observable极为相似。了解到背压,就不得不说背压的几种策略模式:ERROR:上游不停的发射大量事...原创 2019-09-26 17:29:26 · 292 阅读 · 0 评论 -
架构师学习--rxjava操作符(合并型操作符、异常型操作符)使用
一、合并型操作符1、startWith操作符2、concatWith操作符3、concat操作符4、merge操作符5、zip操作符原创 2019-09-23 10:28:59 · 213 阅读 · 0 评论 -
架构师学习--rxjava操作符(过滤型操作符、条件型操作符)使用
一、过滤型操作符1、filter操作符测试代码如下:运行结果如下:这里只打印了3。总结:test方法,返回true,表示不过滤,直接发射到下游。test方法,返回false,表示过滤,不会发射到下游。2、take操作符测试代码如下:运行结果如下:总结:需要配合定时器操作符才能体现take操作符的真正价值当定时器执行take设置的个数后,就会停止计时。3、...原创 2019-09-20 17:34:48 · 169 阅读 · 0 评论 -
架构师学习--rxjava操作符(创建操作符、变换操作符)使用
大家都清楚,Rxjava的问世给我们程序员带来了一大波福利,简单的链式调用就能实现比较复杂的功能,并且逻辑清晰,易于扩展。但是,对于它的学习,还是需要一定的时间成本的。其实它的设计模式主要就是观察者模式,只不过它不是标准版的观察者,它的一个被观察者(Observable)只能对应一个观察者(Observer),并且通过subscribe进行订阅观察者。,下面带大家学习,常用的Rxjava2操作符。...原创 2019-09-20 14:43:38 · 159 阅读 · 0 评论 -
架构师学习--okhttp3责任链模式(包含请求封装和结果解析)
之前原理解析中说到,okHttp3使用了责任链模式添加了很多的拦截器,比如重试拦截器、请求头拦截器等等。有了这些拦截器,就可以把网络请求的不同部分交给各自拦截器实现,然后将拦截器处理的结果拼接成一个完整的请求实体,交给服务器。...原创 2019-09-06 16:58:03 · 385 阅读 · 0 评论 -
架构师学习--手写Glide之复用池
首先了解为什么需要复用池的设计?之前有说过,内存缓存采用LruCache缓存机制,在某个时刻系统会回收或者当我们手动回收一张内存中的图片时,就会将这张图片的内存加入到复用池中,这样当下一次申请图片内存的时候,收钱会从复用池中查找有没有合适的内存,有的话就会复用这块内存,没有的话就会重新开辟一块内存,这样做的好处就避免了内存的不断回收、申请而导致的内存抖动和内存碎片。一、接口BitmapPool...原创 2019-09-05 16:20:20 · 450 阅读 · 0 评论 -
架构师学习--手写Glide之磁盘缓存
前面学习了活动缓存和内存缓存,本章将继续学习磁盘缓存,在内存缓存中我们使用了最少使用算法,并且android也提供了LruCache这个类供我们使用,同样的磁盘缓存也是使用了这个算法,但是遗憾的是android没有提供磁盘缓存的类。所以,我们不得不从github上下载大神的DiskLruCache文件了。下载地址,解压得到三个文件,添加到我们的项目中即可。磁盘缓存类1、初始磁盘缓存类DiskL...原创 2019-08-30 17:54:21 · 257 阅读 · 0 评论 -
架构师学习--手写Glide之内存缓存
之前一篇文章带大家学习了活动缓存,本章将继续学习内存缓存。首先使用了LruCache算法(最近使用)缓存策略,什么是LruCache算法呢?这里对算法内部具体实现不做研究。先看一下android提供的源码:一、LruCache内部其实就是使用了LinkedHashMap的机制,设置为true,表示激活使用排序。使用排序的规则是如何呢?如下图:总之一句话:只要集合中某个元素被使用了,它将会...原创 2019-08-30 17:17:09 · 198 阅读 · 0 评论 -
架构师学习--手写Glide之活动缓存
Glide是目前市场上比较流行的图片加载框架,使用起来很方便,一堆链式调用就可以加载一张网络图片了。第一次加载会比较慢,当我们下次再次加载这张图片的时候,速度将会质的飞跃。这是因为它的图片缓存机制做的非常好。从源码中可以看出,他会用了三级缓存策略,分别是:活动缓存、内存缓存、磁盘缓存。本章将会讲解活动缓存是如何进行设计的一、缓存策略说到缓存策略,就不得不说一下,四种引用的区别了:强引用比...原创 2019-08-30 16:40:45 · 839 阅读 · 1 评论 -
架构师学习--okhttp3连接池实现
首先我们需要明白,okhttp比其他网络请求框架的优势在哪里?当然最重要的就是他对传输层的Socket进行了进一步的封装。所谓的封装,就是拿到服务器最原始的数据流,进行解析,返回给用户。大家需要明白一点,socket的连接是需要消耗资源的,如果每一次网络请求都去创建一个socket,显然是不合理的。所以okhttp就引出了连接池的概念。所谓的连接池就是为了复用socket,比如我们请求一个地址,如...原创 2019-08-29 16:47:48 · 986 阅读 · 0 评论 -
架构师学习--okhttp3原理解析
okhttp是目前最流行的网络框架,为什么这样说呢?本文将带领大家逐步解密。一、使用想必大家在项目中都是如下使用的,这里以一部请求为例:这里可以看出发出一条请求,离不开这几个类:OkHttpClientRequestCallCallback下面就对这四个类逐个击破。二、常用类介绍1、OkHttpClient这个类使用构造者模式,通过这个类我们能够设置分发器Dispatc...原创 2019-08-23 15:57:24 · 511 阅读 · 0 评论 -
架构师学习--数据库升级
我们在平常项目中难免会碰到这样的情况,比如我想在用户表中增加一个字段,来采集用户行为信息。比较常规的做法可能就是,重新测试打包上架,然后提示用户更新app。但是如果用户不更新呢?这样我们就无法采集到这个字段,另外重新打包上架的时间成本也是昂贵的,往往会导致用户的流失。那么有没有一种方法,类似于热修复,在用户无感知的情况下完成这样的数据库表升级呢?其实目前比较主流的做法就是配置xml文件的方式,用户...原创 2019-08-22 11:39:52 · 167 阅读 · 0 评论 -
架构师学习--数据库分库
学习本文内容,需要先去自行阅读架构师学习–数据库框架的基本搭建(增删改查)这篇文章,因为代码都是基于之前的基础上进行开发的。开始之前,我提出几个问题:什么是分库?为什么要分库?如何分库?一、什么是分库所谓的分库就是创建多个db数据库,比如项目中可以有qb.db。当然也可以有1.db、2.db等,根据自己的需求而定,一般小中型的项目是很少用到分库的,比如像淘宝、QQ等这样的大型项目,不可避免的会...原创 2019-08-21 17:34:05 · 271 阅读 · 0 评论 -
架构师学习--数据库框架的基本搭建(增删改查)
本文主要实现如何搭建一套自己的数据库框架。包括数据库的创建、表的创建、数据的增删改查功能、以及数据库如何实现分库、如何进行更新。一、创建数据库及生成数据库表如何使自己的数据库表的创建以更加优雅的方式,我们就需要注解的方式实现。1、创建表名注解类Table2、创建表中字段注解类FieldParams3、创建实体类中不需要保存到数据库的字段注解类Exclude4、创建数据库表实体类S...原创 2019-08-21 15:44:40 · 1446 阅读 · 0 评论 -
架构师学习--插件化之Hook方式(5.0版本~9.0版本)
首选,当我们启动一个activity,在没有在配置文件注册的前提下,会抛出以下异常:一、异常分析那么首先我们需要分析这个异常是在哪里出现的?源码跟踪如下:在checkStartActivityResult()方法中就能看到上面的异常信息。那么如何才能不让系统报这个异常呢,那就需要在这个方法执行之前做些手脚了。查看系统源码,在执行checkStartActivityResult()方法之前...原创 2019-08-13 17:01:54 · 562 阅读 · 0 评论 -
架构师学习--插件化之占位式静态注册广播(apk解析原理)
首先需要知道静态广播是在什么时候注册的?带着这个疑问就不得不分析apk的解析原理。一、apk解析原理1、静态广播注册首先,手机在启动的时候,会把所有的apk的都安装一遍,然后立马就会解析所有apk的配置文件信息,如果配置文件中有广播,就会把它注册。2、apk安装过程会产生3个目录data/app : apk的放置目录data/data/包名/ :应用所属目录,也就是数据库、sp等保存...原创 2019-08-09 17:51:05 · 306 阅读 · 0 评论 -
架构师学习--插件化之占位式(插桩式)
什么是插件化?插件化开发是将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk。插件apk是不需要安装的,运行在手机上的是宿主apk,当需要插件内容的时候,就需要通过宿主apk先加载插件,然后才能操作插件,也就是说插件是没有独立运行环境的,必须依赖宿主的环境。学习插件化,需要了解宿主、插件和标准的关系宿主:运行在手机上的apk插件:服务器上下载的apk包,没有...原创 2019-08-08 17:40:23 · 304 阅读 · 0 评论 -
架构师学习--组件化开发之管理类
前面介绍到组件化的ARouter路由设计和参数传递设计。只是功能进行了实现,没有考虑到进一步的封装,比如界面传参,之前是用如下方式实现:new Main_MainActivity$$Parameter().loadParams(this);这样看起来会比较难以理解,因为使用者并不知道生成了Main_MainActivity$$Parameter()这个类。同样的界面跳转之前使用如下方式: ...原创 2019-08-01 10:18:54 · 296 阅读 · 0 评论 -
架构师学习--组件化开发之路由参数传递
本章主要讲解组件化是如何实现组建之间参数传递的,代码基于之前一章内容架构师学习–组件化开发之路由ARouter设计一、如何实现模块之间参数的传递1、通过getIntent()传统方式2、通过javapoet最终生成的文件格式如下:二、代码生成1、创建参数注解2、创建注解处理器(1)遍历Parameters节点(2)解析Parameters节点,并保存到mapmap集合...原创 2019-07-29 17:00:25 · 258 阅读 · 0 评论 -
架构师学习--组件化开发之路由ARouter设计
使用过阿里开源项目ARouter路由框架的都知道,为组件化开发打开了一扇大门。使用组件化的目的就是解决团队开发,各自负责各自的模块,互不干扰,模块之间能够完全解耦,加快开发效率。这样做还有一个好处就是,如果有一个功能模块不需要了,可以在app中删除该模块的依赖即可,不需要大量的删除代码。核心技术是Javapoet,没有了解它的可以看另外一篇文章javapoet简单实用一、如何实现模块之间acti...原创 2019-07-29 15:54:42 · 303 阅读 · 0 评论 -
架构师学习--组件化开发之Gradle配置
Gradle其实是一个构建工具,它是用来帮助我们构建app的,构建包括编译、打包等过程。其实AS默认就为我们的app完成构建,并且每一个module的构建过程都是大同小异的,那么我们就可以提取共同点,比如公共的第三方库等,并且在组件化开发中必然离不开它。一、简单使用创建一个工程,默认会构建app,自己新建一个module,命名为library。...原创 2019-07-26 13:35:11 · 325 阅读 · 0 评论 -
架构师学习--动态换肤
11原创 2019-07-25 15:43:52 · 482 阅读 · 0 评论 -
架构师学习--内置换肤
一、换肤原理首先需要明白以下几点:setContentView()原理布局加载工程Factory2super.onCreate()原理如何拦截Factory2下面就以上几点进行源码分析1、 setContentView()(1)都知道通过setContentView()能够加载布局,那么布局是xml文件,它是如何加载到内存中的呢?首先跟踪源码,最终会跟到AppCompatDel...原创 2019-07-24 13:58:15 · 288 阅读 · 0 评论 -
架构师学习--组件化开发之APT使用及JavaPoet
一、概念及作用什么事是APT?全称是Annotation Processing Tool,翻译过来就是注解处理工具,它的作用就是可以在代码编译期间对注解进行处理,并且生成Java文件,减少手动的代码输入,因此它能够使我们编写的代码更加优雅。目前很多优秀的第三方库就是使用APT的技术,比如butterknife、retrofit、enentBus等。二、使用1、在当前工程中创建注解的java ...原创 2019-07-15 22:59:44 · 343 阅读 · 0 评论 -
Binder原理之PMS、AMS注册到ServerManager
先上一张流程图,稳住军心,对着流程图分析更加有信心一、什么是SystemServer源码位置:frameworks/base/services/java/com/android/server/SystemServer.javaSystem Server是android 基本服务的提供者,是android系统运行的最基本需求,所有service运行在一个叫system_server...原创 2019-07-11 17:09:05 · 638 阅读 · 0 评论 -
Binder原理之Client端、Server端、Binder驱动、ServerManager
Binder在android中无处不在,它提供了android应用间跨进程的能力。其中aidl接口就是Binder的辅助工具,详解参考文章Binder原理解析附上自己花的流程图原创 2019-07-11 16:00:15 · 392 阅读 · 0 评论 -
架构师学习--Handler及ThreadLocal
首先引入几个问题:Handerl如何避免内存泄漏 更新view,难道只能在UI线程吗?子线程不可以吗? 子线程中为什么不能创建Handler new Handler的两种方式区别 ThreadLocal用法及原理一、Handerl如何避免内存泄漏1、首先写一段内存泄漏的代码,如下:public class HandlerActivity extends AppCompatA...原创 2019-07-03 17:01:26 · 357 阅读 · 0 评论 -
架构师学习--MVVM
一、概述M:model层 这里指javabean对象。V:就是我们的布局文件VM:负责绑定view层,业务处理。二、使用1、创建View层activity_mvvm.xml,代码如下:<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.c...原创 2019-07-01 13:58:24 · 198 阅读 · 0 评论 -
架构师学习--MVC
一、概述M:model层 一般指javabean对象 。当然也可以处理业务逻辑V:就是我们的布局文件C:Contraoller层 就是我们的activity。二、使用1、创建View等activity_mvc.xml,代码如下:<!--View层--><?xml version="1.0" encoding="utf-8"?><andro...原创 2019-06-27 16:39:24 · 147 阅读 · 0 评论 -
架构师学习--MVP
一、概述MVP相比较于MVC ,能够解决MVC的内存泄漏问题。并且业务模块分的更加明确。M:model层 一般指javabean对象 。当然也可以处理业务逻辑V:activity 发起请求,交给presenter处理P:Presenter层 负责将activity的请求交给model层处理,也可以自己处理。并将处理结果返回给view层比如我们真实的业务中,登陆请求。下面看...原创 2019-06-26 09:33:41 · 184 阅读 · 0 评论