Android技巧
文章平均质量分 79
战国剑
being
展开
-
简易版LiveData-->实现MVVM
遵循LiveData原理,摒弃其中的复杂逻辑,只取LiveData的响应更新能力,做一套简易版本的实现。一、简易的ViewModelpackage com.example.jetpacktest;public class ViewModel { public String name; public int count;}二、简易的LiveData实现--命名为:ObserableAnypackage com.example.jetpacktest;impo原创 2021-11-26 15:58:46 · 1777 阅读 · 0 评论 -
Android Crash治理
现状正式上线的程序上,Crash是最破坏用户体感的一种行为。Crash率因此也成为衡量一个App稳定性最重要的标志。Android系统可定制化而导致的碎片化、业务的高速发展、多商家定制业务、多人员协同开发等,导致的crash率无法稳定保持在安全线下。Crash治理总体方案针对线上与测试中遇到的各种Crash,我们的处理方式通常是发现一个,处理一个。而进一步,则是希望在处理过程中能将某些有共性的Crash的处理方式提取出来,并在后续能做到有效预防。总体来说,治理方案应该是:原创 2021-07-15 00:27:18 · 768 阅读 · 1 评论 -
框架手写系列---RxJava之从零开始
RxJava是我们日常在java与android中十分常用的一个库。它的作用是作为一个异步链式调用框架,将一个可能复杂的程序流程,转换为从顶向下的线性调用。避免了传统流程中,程序结构复杂以及可能的多重回调的样式。这里将从零开始,手写一个RxJava,从代码和设计模式角度做步步变换,一步步的完成该框架。一、传统观察者模式如何转换为链式调用都知道RxJava是基于观察者模式的。但在使用RxJava中,可以看到这与传统的观察者模式是有较大差别的。传统观察者模式:基本上是一个被观察者对应多个观察者。原创 2021-04-05 23:55:17 · 214 阅读 · 0 评论 -
框架手写系列---Asm方式实现日志插入
asm与javassist作为修改字节码文件的两种常用方式,在编译过程中,可以动态修改class字节码文件。前文已用javassist方式实现热修复的前置步骤,本文用asm实现动态的给每个activity插入Log日志。一、插件的生成与依赖导入1、用该文章中的方法:Android中Plugin插件工程的自动生成自动生成一个android的插件模板;2、加入asm依赖,加入依赖后的插件build的格式如下:dependencies{ compile gradleApi() ..原创 2020-09-27 23:10:21 · 1117 阅读 · 0 评论 -
框架手写系列---AspectJ方式实现埋点上传框架
一、切面编程AOP、OOP是程序中经常涉及的概念。OOP--面向对象编程,java、c#等都是面向对象的编程语言,主张万物皆对象。AOP是一种编程思想,对OOP的有效补充,在具体代码中,可以针对任意方法、属性、类等,做一个切面处理。针对被标记(注解标记)的代码,做额外处理。AspectJ是AOP思想的实现方式,将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务原创 2020-08-16 16:02:31 · 417 阅读 · 0 评论 -
框架手写系列---javassist修改字节码方式,实现美团Robust热修复框架
本文用javassist方式,模拟美团Robust插件的前置处理:用插入代码的方式,针对apk中的每个方法都插入一段静态代码判断语句,用于控制是否启用热修复fix(也就是动态加载patch包到原apk中)。一、插件的生成与依赖导入1、用该文章中的方法:Android中Plugin插件工程的自动生成自动生成一个android的插件模板;2、加入javassist依赖,加入依赖后的插件build的格式如下:dependencies{ compile gradleApi() ..原创 2020-08-15 22:24:34 · 583 阅读 · 0 评论 -
框架手写系列---apt方式实现ARouter框架
一、ARouterARouter是阿里开源的组件通讯框架,在组件化开发上也是十分常用的框架之一。它的主要作用是各个activity之间,无需直接依赖,就可以直接跳转与传参。主要用处是为组件化的解耦,添砖加瓦。二、ARouter原理ARouter的核心原理,十分简单:用注解标识各个页面,注解处理器将该注解对应的页面存储到一个统一的map集合中。当需要页面跳转时,根据跳转的入参,从该map集合中取到对应的页面和传参,并跳转。核心在于,如何构建一个合理的map集合。三、手写实现根据原理原创 2020-06-28 19:21:32 · 629 阅读 · 0 评论 -
框架手写系列---apt注解处理器方式实现ButterKnife框架
一、ButterKnifeButterKnife作为常用框架之一,主要用于简化代码,减少重复代码。这里主要注重原理与核心,将分步骤手写它的核心代码。ButterKnife最常用的是去除代码中的findViewById,以注解的方式代替原有的代码,这里也从这里入手。Android之注解的使用——绑定android控件这是前文中通过反射方式实现,可对比查看二、原理说明public class MainActivity extends AppCompatActivity { .原创 2020-06-28 18:32:49 · 511 阅读 · 0 评论 -
框架手写系列---通过反射手写EventBus框架
一、EventBus原理与分析EventBus作为常用框架之一,从早期的EventBus2.0到目前3.+,经历了从反射到apt实现的转变,本文以原理分析为主,以反射方式实现早期的2.0框架。EventBus的核心在于:将被注解的方法(如@Subscribe注解方法),放到Map中。后续post的时候,根据post的参数类型(如Message类)在Map中找到对应的方法,并调用。将步骤分解后,就是以下两个主要操作:1、注册:通过特定的注解(如@Subscribe),将被注解的方法,添加到Ma原创 2020-06-28 16:05:38 · 242 阅读 · 0 评论 -
Android中Plugin插件工程的自动生成
一、Task作用Android Studio中对新建Gradle Plugin工程,并没有很好的支持,需要按要求新建特定的文件夹与文件。针对这种情况,通过task任务,自动生成一个这样的脚手架工程,可以自动生成Gradle Plugin的结构。二、Gradle Plugin的工程生成自动创建插件task: 以下是一个自动创建android中Plugin插件的task。直接将这个task复制到任意工程的build.gradle中,同步后,即可得到一个Plugin插件。 其中三个入原创 2020-06-27 11:39:42 · 894 阅读 · 0 评论 -
JetPack架构---LiveData、ViewModel搭建MVVM结构工程
一、MVVM与JetPackMVVM,是Model-View-ViewModel的简写。Model:数据,View:UI相关,ViewModel:UI相关数据与控制。JetPack提供的组件LiveData与ViewModel,十分契合该模式。(1)LiveData作为数据驱动的核心,驱动与监听Model数据变化。(2)ViewModel组件,作为页面数据管理的存储与控制中心。(3)Activity或Fragment,也就是MVVM中的View。MVVM的核心在于,通过数据...原创 2020-06-14 23:02:06 · 1382 阅读 · 0 评论 -
JetPack架构---LiveData的使用与示例
点此,查看 :LiveData的原理解析本文介绍:LiveData的单独使用、LiveData与ViewModel结合使用、LiveData的复杂使用一、LiveData的单独使用以一个整型数据为例。将该整型数据用MutableLiveData包装。在Activity中,监听count的变化:每次点击按钮,会生成随机数,并Toast表现。public class LiveDataActivity extends AppCompatActivity { //定义一个Mutable原创 2020-06-13 23:00:57 · 1222 阅读 · 0 评论 -
JetPack架构---ORM数据库Room的使用
Room库在 android在sqlite的基础上做的一个封装,让用户能更方便的使用数据库。Room库实际与GreenDao数据库类似,优于GreenDao的是:(1)Room库的sql语句,在编译时,编译器会做检查。(2)整体上使用更方便,也因是官方库,会有更好的支持。一、依赖在build中新增依赖def room_version = "2.2.5"implementation "androidx.room:room-runtime:$room_version"annot..原创 2020-06-07 20:53:17 · 375 阅读 · 0 评论 -
JetPack架构---Navigation的使用
一、概念JetPack中的Navigation组件,用于帮助用户实现导航。Navigation组件的主要应用场景是单activity配合多个fragment的场景,简化了过去fragment管理、导航复杂问题,提供了一套统一的标准。Navigation需要在Android Studio3.3或更高版本才可使用。二、示例2-0:添加依赖def nav_version = "2.3.0-alpha01"// Java language implementationimplemen原创 2020-05-24 22:44:32 · 1270 阅读 · 0 评论 -
JetPack架构---Lifecycle生命周期相关与原理
一、概念Lifecycle是JetPack提供的生命周期感知型组件。这也是JetPack系列架构的一个主要基础组件。LiveData、ViewModel都与之相关。Lifecycle常用于感知Activity、Fragment的生命周期。通过它可以编写与生命周期相关的解耦的代码。将Lifecycle传入某个类中,可以让该类与外部组件的生命周期关联。二、使用示例2-0:添加依赖参照官网提示,添加具体依赖(点击查看)2-1:定义一个观察者//定义一个观察者public class原创 2020-05-24 09:45:55 · 503 阅读 · 0 评论 -
JetPack架构---ViewModel作用、使用与原理
一、ViewModel的作用1、ViewModel用于管理与界面(Activity、Fragment)相关的数据。2、ViewModel让数据可在发生屏幕旋转等配置更改后仍能继续存在。3、ViewModel让Activity与Fragment共享数据更方便。ViewModel作为JetPack中一个重要部件,本身并不复杂。ViewModel总结起来就一个功能:保存数据,并且在ViewModel中的数据,不会因为配置变化(横竖屏转换)而丢失,只有在Activity真正被销毁的时候,才会真正..原创 2020-05-17 23:10:51 · 2485 阅读 · 0 评论 -
JetPack架构---LiveData特性、原理
一、LiveData的概念与优势官网介绍LiveData的概念是这样的:LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。归类的说,它有三个特点:1、它是一个数据存储器类,能持有数据;2、它可被观察者观察,当存在观察者时,它的数据变化会通知到观察者;3.原创 2020-05-16 23:35:35 · 638 阅读 · 2 评论 -
Android内存泄漏--基础介绍与延伸解析
Android内存泄漏的原创 2020-04-26 23:25:34 · 546 阅读 · 0 评论 -
Android(Java)之多线程结果返回——Future 、FutureTask、Callable、Runnable
Android、Java中Runnable十分常见,在开新线程时,我们常用new Thread(Runnable).start() 或者线程池搭载Runnable。日常使用,在不需要线程返回时,使用的十分顺手。在需要线程返回时,我们也有办法搞定,比如外部变量控制流程、新增监听接口等。有了以上理由,Callable就被冷落了。其实Callable能让你的实现以及代码更简单。本文就是以原创 2016-06-20 20:28:50 · 7955 阅读 · 0 评论 -
Android之数据库—— 一个可配置的简易框架
前言Android自带的Sqlite数据库是日常开发中必用的。这里介绍一种用xml形式配置数据库的简易框架(库)。为什么要用这个框架?(1)因为XML格式的配置方式,层次明显,一目了然;(2)在扩展,对增减数据库中的表或者列,更加容易且不容易出错;(3)将配置统一在XML中,对以后的维护,会显得十分方便;(4)最后,是这个框架很简单。一、设计1、你首先要有一个XML原创 2016-07-05 21:56:24 · 4538 阅读 · 0 评论 -
Android捕获异常处理——UncaughtExceptionHandler
日常代码的编写中,你遇到的程序崩溃肯定不会少。空指针、转型失败、数组越界之类的,你应该都有碰到。当你碰到这些的时候,你代码中已经有写了try-catch,但是它并没有把这可能的异常捕获处理。你也只能看着界面上跳出的“.....已停止运行”,这对你来说,你知道问题所在,但如果是一个用户角度来说,他应该就觉得,这程序好烂。有办法捕获这种异常,并处理吗?android提供了UncaughtE原创 2015-12-17 19:24:29 · 3213 阅读 · 1 评论 -
非对称加解密——RSA加密、解密以及数字签名
对称与非对称加解密,最主要区别在于:对称加密,加解密的密钥是一致的;非对称加密,加解密的密钥是不一致的;对称加密的例子如另一篇文章中的DES加解密、3DES加解密。这里要介绍的是非对称加解密中,应用最广泛的一种:RSA。RSA简介RSA的由来,你可以简单的百度到,它是由三位大神在1978年提出的一种高安全性的算法。具体可看百度百科:RSA在使用中,主要有三个步骤:RSA原创 2016-01-02 21:09:07 · 9724 阅读 · 1 评论 -
Android序列化——Serializable与Parcelable
序列化这个名词,我们在学习java的时候早有耳闻,与之相对的还有反序列化。在java中我们印象中常用的序列化方式是实现Serializable接口。那么,在android中,我们如何实现这样的序列化和反序列化呢?序列化的意义序列化,我们首先要明白它代表的含义以及为什么要使用序列化。序列化:将对象转为字节序列的过程,我们称之为序列化。序列化的意义:序列化主要是为了解决对象的持原创 2016-01-03 21:33:22 · 3300 阅读 · 0 评论 -
Andorid动画——属性动画
上一篇主要记录了android补间动画与帧动画的使用:http://blog.csdn.net/yangzhaomuma/article/details/50530355。这里则是属性动画的使用和说明。属性动画与补间动画、帧动画的写法区别 在编写这两种动画的时候,你会发现他们在类的写法上是很相近的。初学者容易在这里混淆,这里做个简单说明:原创 2016-01-20 00:52:50 · 1011 阅读 · 0 评论 -
Android异步处理——Handler、Looper、Message、MessageQueue
Android异步处理是日常中常见的做法:当你在做耗时操作的时候,开个线程。如果需要更新UI,那么你最常用的就应该是Handler这个机制了。网上对Handler机制的描述很多,如果不了解的,可以先看看以下网址上的解释,十分详尽:http://blog.csdn.net/guolin_blog/article/details/9991569这里,主要是讲Handler在应用中,需要原创 2015-12-20 14:46:29 · 739 阅读 · 0 评论 -
Android线程结束——合理的结束你想结束的线程
线程是你在Android中避不开的一个话题。因为Android后期版本对主线程不允许运行耗时操作的规定,你新开线程的几率比起java,大大的提升了。这样就会碰到一个问题,当你开启线程,在线程没有运行完的时候,想要结束这个线程,要怎么操作呢?标志位结束线程这是一种我们很容易理解的结束方式。设置一个标志位,当你想要结束线程的时候,就把这个标志位的状态改变。直接看代码,更容易理解:原创 2015-12-22 20:20:31 · 3555 阅读 · 0 评论 -
Android远程接口之AIDL——Parcelable、in、out、inout简例
AIDL简义Android中的数据传输、方法调用等,常见的是集中在应用程序内的Activity之间,如Activity-A传递到Activity-B。这样的数据传输、方法等都是在一个应用程序间调用,也就是在一个进程内。那如果我们要在不同的进程间传递数据,我们要怎么做呢?不在同一个进程间,它们是无法共用内存的,Android为了实现进程间的数据共享,提供了AIDL机制(安卓远程接口定义语言)原创 2016-01-25 00:21:30 · 16322 阅读 · 5 评论 -
Android中的OAuth2.0——QQ第三方授权登录
OAuth2.0概念OAuth2.0是现在第三方授权主要采取的一种协议。简易的说就是:第三方应用在不知道用户的用户名、密码等认证ID的情况下想要访问该用户的资源,可通过该用户授权的方式,获取相应权限,访问相应资源。学习这个授权协议的时候,因为网上有太多的开放平台和介绍,OAuth又有1.0和2.0两个版本,因此看上去很混乱。你有时候不知道自己看的是1.0的协议介绍,还是2.0的协议原创 2016-01-10 18:09:35 · 6907 阅读 · 2 评论 -
Android图片处理之高斯模糊示例——仿微信朋友圈照片模糊效果
微信朋友圈最近出了一个模糊照片效果,一看之下很有新意。这里就是仿微信朋友圈的一个图片模糊效果实现。使用了一个开源的FastBlur(高斯模糊——毛玻璃效果)。实现的方法很简单,只要一句代码即可。Bitmap bitmap= FastBlur.doBlur(BitmapFactory.decodeResource(getResources(), R.drawable.blur), 10,原创 2016-02-01 13:25:47 · 6269 阅读 · 4 评论 -
Android监听——回调模式与观察者模式
在android中,或者说java中,监听模式都是非常常见的。当你激发某个事件,常常你需要等待这个事件的返回。如果这个事件是个异步事件,那么监听总是显得很有必要。举个日常的例子,当你在android中连接网络并发送请求时,你就常常需要用到异步监听,用于监听并回调请求结果。这个就是异步回调。观察者模式与回调模式有很多的相似处,简单对比就是:回调是一对一的关系,只监听一个事件;观察者模式则原创 2016-03-24 00:14:59 · 8468 阅读 · 1 评论 -
Android之增量更新
Android增量更新简单描述:简单的说,就是在有一个旧版本A的情况下,想在这个基础上更新一个新版本B。那么,我们不需要下载整个B,只需要下载A与B的差分包。将差分包下载到本地后,与旧版本A整合为一个新的apk,这个apk大小与内容与新版本B完全一致,这就是增量更新。假如,A的大小是5M,B的大小是8M,那么差分包的大小S=(8-5)+差异文件的依赖(如上下文)。差分包的大小会大于3M。原创 2016-02-29 21:01:38 · 989 阅读 · 0 评论 -
Android解析——json解析为javabean
json的解析,归根结底就是用JsonObject以及JsonArray来实现的。在日常中,当我们拿到一个较为复杂的json字符串的时候,用以上两个虽然能实现解析,但显得很麻烦。这里介绍下用Gson类来将json解析为javabean。用两个json字符串来分析:一、简单json字符串的解析String JSON_SIMPLE_STRING="{\"sitename\":\"JSO原创 2016-03-28 01:44:51 · 6163 阅读 · 1 评论 -
Android之注解的使用——绑定android控件
注解介绍注解最早是在Java的JDK5中出现的概念,并在JDK5推出后风行天下。Android也继承了这种概念和语法。这里介绍一下,注解在android中用的最火的一个例子,对控件的注解。{对注解不熟悉的同学,可以看以下几个博文,写的很详尽:注解的基本解释:http://www.cnblogs.com/peida/archive/2013/04/23/3036035.htm原创 2016-04-18 22:15:47 · 2933 阅读 · 0 评论 -
Java(Android)回调函数详解
一、前言本周有位入行开发不久的朋友问我回调究竟是个什么概念,在网上看了很多的回调函数解释,但是越看越乱。虽然回调函数这个梗已经不新鲜了,这里还是用书面的形式记录下。如果有了解的,就无需再看。二、概念概念上,这里引用百度百科的解释,如下:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回原创 2016-07-22 20:09:35 · 4735 阅读 · 0 评论 -
Android之本地缓存——LruCache(内存缓存)与DiskLruCache(硬盘缓存)统一框架
本文参考郭霖大神的DiskLruCache解析,感兴趣的朋友可以先到http://blog.csdn.net/guolin_blog/article/details/28863651了解。一、前言该框架或者说库,主要是用于本地的图片缓存处理。数据的存入当你取到图片的元数据,会将数据存入硬盘缓存以及内存缓存中。数据的获取取数据的时候,先从内存缓存中取;如果没有取到,则从硬原创 2016-07-02 13:15:43 · 10554 阅读 · 1 评论 -
Android异常处理——try、catch、finally、throw、throws
在代码的编写工作当中,我们会遇到很多有关错误处理的内容。 这个时候,你用的最多的应该是try-catch-finally,这样的句式。系统提供的这个句式极大方便我们的处理。我们可以抛出异常、抓取异常、显示异常到前端。但工作中我们大部分时候需要分工合作,因此规范的写法显得尤为重要,不然,后端很多异常处理不规范,将会导致前端人员抓瞎! 后端抛出异常、前端抓取异常,应该是我们基本的规范。 后端抛出的原创 2015-11-23 00:32:40 · 24120 阅读 · 2 评论