Android
文章平均质量分 83
firtzXu
这个作者很懒,什么都没留下…
展开
-
带着问题去看下 Lifecycle 源码
在写完上篇 带着问题去看下ViewModel源码 之后,虽然将 ViewModel 都交代清楚了,不过最基础核心的 Lifecycle 组件 部分并没有进行说明,因此这篇就专门说一下 Lifecycle 组件,下面开始正文Lifecycle组件 的使用使用 Lifecycle 组件的话,我们可以相对轻松去响应指定组件( 通常都是 Activity )的生命周期变化,因此利用 Lifecycle 组件,我们可以避免在 Activity 等组件 的生命周期回调中写大量管理组件的代码,进一步精简了我们的项目代原创 2021-04-22 20:19:16 · 359 阅读 · 0 评论 -
带着问题去看下ViewModel源码
ViewModel 可以监听到当前 Activity 的 onDestory 方法来自动切断与 Activity 的联系,并且回调 ViewModel 里面的 onClear 方法,方便 使用者 去进一步去释放数据,不得不说这是一个很实用的利器那么问题来了:ViewModel 是怎么去监控 Activity 的生命周期的?这个是一个面试题目,Activity 屏幕旋转后,Activity 经历了销毁和重新创建后,为什么 ViewModel 没有销毁,而是沿用之前的 ViewModel 对象呢?.原创 2021-03-26 00:44:26 · 358 阅读 · 0 评论 -
关于 Gson 容错的思考
最近项目中遇到了两个 Json 解析的坑,一个是后端没有按照约定返回对应类型的字段,文档说明写了 int ,但是它直接返回了 String 类型;另外一个数据请求成功后, data 是一个 Object 类型,但是如果数据请求失败,后端直接返回了 List因为这两个坑,后端周末紧急加班去发版本, 不过就勾起了我对 Gson 容错的方案思考Gson 源码的分析要解决业务方的需求,客户端这边想法子做一定的 Json 容错,那么就必须去了解一下 Gson 的源码了先看下 Gson 的日常用法:Gso.原创 2021-01-31 23:57:04 · 396 阅读 · 0 评论 -
记一个使用系统相机拍照后照片被旋转的问题
最近在做项目的自定义相册时,遇到了这么一个问题:从 小米9 手机上面的拉起系统相机进行拍照,然后上传到服务器上面,发现图片莫名其妙就旋转了 90° ,这个并不符合业务方的需求,在仔细分析后,发现拍照后,系统保存到本地的照片已经给旋转过了因此要解决这个问题,就只有在拍照后,判断图片是否给旋转,如果有,就将它旋转回去要获取图片的旋转信息,其实就是要获取图片的 Exit 信息,它里面存储了图片的全部参数,我们可以通过 ExifInterface 来获取到这个数据:/** * 读取图片的旋转的角度 *.原创 2020-12-06 22:51:32 · 2459 阅读 · 5 评论 -
Android增量更新
现在国内的各大应用市场都有省流量更新的功能,只需要你将最新版本的 apk 上传到它们的应用市场上面进行更新,用户在通过应用市场更新应用时,都可以看到体积较小的升级包,这背后的技术,就是增量更新增量升级的基本流程:用户手机上面已经安装的目标应用,它的版本号为 1,而目前该应用的最新版本的版本号为 2将版本号为 1 和版本号为 2 的两个目标应用的安装包,进行差量对比,得到一个差分包(这个就是增量包)版本号为 1的应用和增量包进行合并得到版本号为 2 的安装包,并进行覆盖安装从上面的流程就可以.原创 2020-05-17 23:54:46 · 331 阅读 · 0 评论 -
Glide 的 transformation
Glide 里面内置了一套图片改造机制,名叫 Transformation ;利用这套机制,我们可以轻松实现以下的效果:调用的方法也很简单,就拿其中一个来举例:RequestOptions requestOptions = new RequestOptions() .transforms(new CenterCrop(), new CircleCrop());Glide.with(t...原创 2019-12-15 11:16:49 · 1396 阅读 · 0 评论 -
Glide里面的几个线程池
一.概述在日常开中,如果经常使用到线程的话,如何快捷创建和关闭回收线程是一件较为麻烦的事情,因此 阿里巴巴的Java规范插件 一直都是建议使用线程池来管理线程使用线程池有那些好处?复用存在的线程,减少线程的创建,减少线程的开销,进一步提高了效率通过阻塞队列来控制最大的线程并发数,让内存等消耗限制在一个合理的范围内二.线程池的相关参数我们要怎么使用线程池呢?我们先来看下线程池参数最全...原创 2019-03-31 00:09:43 · 6241 阅读 · 2 评论 -
对 Drawable 的一些分析
Drawable 在日常开发中经常用到,我们经常用它来给 View 设置背景图片,它到底是怎么做到的呢?这篇就带大家去了解一下先看个例子我写过一篇 Android绘制圆形图片的3个方法 ,这里就用里面的一个demo来用下:public class CircleHeadView extends View { private Paint mPaint; .... { ...原创 2019-03-16 13:58:09 · 209 阅读 · 0 评论 -
Android绘制圆形图片的3个方法
在日常开发中,我们经常需要用到圆形图片,最近总结了3个绘制圆形图片的方法,在这里总结一下BitmapShaderBitmapShader 是 Shader 的子类,Shader 是 画笔的着色器,是用于给画布着色,利用 BitmapShader ,我们可以给画布绘制一个圆形图片:public class CircleHeadView extends View { privat...原创 2019-02-13 22:08:11 · 3640 阅读 · 0 评论 -
高效易用的okio(三)
在上篇 高效易用的 okio(二) 的结尾提到了 Segment ,这是一个内存缓冲区, IO 读写操作能如此高效,都是通过这个 SegementSegement 本质是一个字节数组,同时也是一个循环双向链表,同时为了提高效率,okio 还提供了一个 SegmentPool 用于存储空闲状态的 Segment 用于复用,它们构成了 okio 高效的内存使用政策,它们的关系如下图:Segmen...原创 2019-01-01 21:47:58 · 333 阅读 · 0 评论 -
高效易用的okio(四)
超时机制在我们的日常生活中随处可见,最为常见就是火车了,如果你不能按时到达火车站点,那么你就错失坐这一趟火车的机会在前面的文章,就已经提到过 okio 中的有一个超时机制 Timeout, 现在就来说说它的原理okio 中的超时机制只要就两种:同步超时 Timeout异步超时 AsyncTimeout还有一个超时对象 ForwardingTimeout ,不过这个属于一个空盒子,需要...原创 2019-01-05 14:29:13 · 879 阅读 · 0 评论 -
Android Studio 自定义模板
前言在开发 Android 项目的过程中,难免会遇到重复编写同一段逻辑的代码的情况,就拿目前比较流行的 MVP 模式来举例好了,要实现一个页面的 MVP 开发,我们需要编写以下的类:一个 MVP 的契约接口,里面有一个 view 层接口 和 P 层的接口(或抽象类)对应的view 层接口的实现类对应的P 层接口的实现类对应的 model 层如果当前页面需要使用 RecyclerVi...原创 2018-12-23 21:56:05 · 456 阅读 · 0 评论 -
Android中获取TextView一行最多能显示几个字
日常工作中,我们有时候需要知道一个 TextView 一行最多显示几个字符,这里提供两个方法(这两个方法都需要知道 TextView 的宽度)方法一: /** * 获取textview一行最大能显示几个字(需要在TextView测量完成之后) * * @param text 文本内容 * @param paint textview.g...原创 2019-03-24 16:15:56 · 8132 阅读 · 0 评论 -
Glide源码分析之load方法
这里承接上篇 Glide源码分析之with方法 ,这篇将对Glide.with(FragmentActivity).load(URL).apply(centerCropTransform()) .into(imageViewRes); 中的 load 方法进行分析(PS:本人阅读的源码为 Glide 4.7 版本)先贴出 load 方法的时序图:接着就来依据这个时序图来阅读源码吧S...原创 2019-05-02 14:00:01 · 1042 阅读 · 0 评论 -
SharedPreferences的分析与实践
SharedPreferences 是 Android 里面一个轻量级别的存储方案,不过随着项目的发展,SharedPreferences 使用不当,也很容易引发一些问题,甚至会导致 Crash 的发生因此,我们有必要搞清楚 SharedPreferences 的基本原理SharedPreferencesSharedPreferences 的本质是一个基于xml文件存储的key-valu...原创 2019-04-28 00:12:07 · 328 阅读 · 0 评论 -
Glide源码分析之如何获取到View的宽高值
我们知道 Glide 默认会依据传入的 View 的宽高来裁剪图片的宽高,那么 Glide 是怎么拿到 View 的宽高值的呢?我们带着疑问,看下源码吧在 Glide.with(FragmentActivity).load(URL).into(imageView); 这个过程中,我们在 into 里面传入了 ImageView ,通过查看源码:public ViewTarget<...原创 2019-06-08 22:44:37 · 763 阅读 · 0 评论 -
View与Activity之间不可不知的关系
最近因为工作需求,需要搞明白 Activiy 与 View 之间的一些生命周期关联的情况,于是这里做一个详细的记录View 和 Activity 一样也是有着自己的生命周期方法,熟知这些生命周期方法对我们日常开发绝对会有不少帮助的(比如我最近遇到的一些自定义 View 的需求),下面我们通过自定义一个 View 来打印它的全部生命周期方法吧:public class LifeView ex...原创 2019-06-16 15:37:43 · 548 阅读 · 0 评论 -
在 Dialog 或 Popupwindow 中修改activity的光亮度
我们平时使用的 Dialog 和 Popupwindow 在出现时都会让手机屏幕变暗,但是某些时候我们需要它不要变暗或者变得更加暗应该怎么办呢?这时候就需要修改 Activity 的透明度参数了: /** * 设置Activity的透明度 */ private void setUpWindowAlpha(float alpha) { //获取act...原创 2019-06-30 00:02:21 · 255 阅读 · 0 评论 -
View绘制的一问一答
最近从网上收集了一些 View 绘制的面试题来做练习,算是温故而知新了1.View 的绘制流程是从哪里开始的?哪个过程结束后,我们才能看到 View 的显示?View 是个抽象类,它在内部封装了测量(measure),布局(layout)和绘制(draw)的方法,但是以上方法的触发都是交给上层 ViewRootImpl 来的,View 整体的绘制流程如下:ViewRootImpl(它处...原创 2019-08-07 00:08:01 · 265 阅读 · 0 评论 -
Fragment 的 getActivity() 为什么会返回null
这个是同事询问我的一个问题:明明 Activity 没有给销毁,为什么 Fragment 的 getActivity() 有时候会返回一个 null 呢?在解答他的疑问之后,也在博客中记录一下Fragment的生命周期我们先通过打印来看下 Fragment 各个生命周期里面, getActivity() 是否会返回了 null :public class TestFragment e...原创 2019-09-13 16:53:06 · 746 阅读 · 0 评论 -
ViewPager的一些扩展
ViewPager 是开发中经常用到的控件,这里笔者总结了一些日常开发用到的一些扩展1.渐变色背景效果这是一种比较吸引眼球的效果,不过实现原理其实非常简单,就是监听一下 ViewPager 的 onPageScrolled 并动态改变背景色值就可以了。核心代码如下:@Overridepublic void onPageScrolled(int position, fl...原创 2018-03-05 01:00:09 · 670 阅读 · 0 评论 -
Gson 处理空字符串的一个小技巧
在项目开发的过程中,经常会遇到空字符串的 json,为了避免遇到空指针的问题,我们往往要进行字符串的判空处理,不过如果是使用 Gson,则可以通过自定义 TypeAdapter 来处理空字符串的问题定义一个处理空字符串的 TypeAdaper: public class StringNullAdapter extends TypeAdapter<String> { ...原创 2018-12-27 23:10:57 · 4079 阅读 · 0 评论 -
高效易用的okio(一)
okio 作为 okhttp 的底层 IO 库,对比 Java 的原生 IO ,提供了更灵活易用的API 来处理数据流的输入和输出,某程度上,我们可以放弃 Java 的原生 IO,转为使用 okio 作为 日常开发的 IO 框架Java 的原生 IO在正式介绍 okio之前,我们有必要先来回顾一下 Java IO 的一些基础知识程序内部和外部进行数据交互的过程,这个输入输出(input/ou...原创 2018-12-10 22:04:47 · 838 阅读 · 0 评论 -
高效易用的okio(二)
在上篇文章中,我们知道了一些 Java IO 的概念,也了解了 okio 的用法,现在我们来分析一下源码Okio我们回到上篇的代码: Source source = Okio.source(new File(mPath)); String read = Okio.buffer(source).readString(Charset.forName("utf-8"));显而易见 Okio...原创 2018-12-15 00:55:53 · 433 阅读 · 0 评论 -
Glide通过清单文件加载GlideModule的原理
前言Glide 是 Google 官方推荐的一款图片加载库,我们可以通过配置 GlideModule 来修改 Glide 的一些初始化配置。具体做法如下:继承 GlideModule 接口并实现其对应的方法:public class MyGlideModule implements GlideModule { @Override public void applyOp...原创 2018-06-21 00:11:10 · 5629 阅读 · 1 评论 -
线程小白的学习笔记
本篇为 Java编程的逻辑 的并发内容的学习笔记什么是线程?线程是表示一条单独执行的程序执行流,它有自己的程序计数器和栈。创建线程Java 中的 Thread对象 实现了 Runnable 接口,因此创建线程的方法有两种。public class Thread implements Runnable {}1.继承Thread通过继承 Thread 并...原创 2018-06-12 22:32:21 · 140 阅读 · 0 评论 -
记一次内存优化的经历
这几天在使用开源项目 Leakcanary 对 App 的内存泄露进行检测和改善,效果是明显的,这里总结一些让我印象深刻的内存泄露情况。RecyclerView 引发的内存泄露会发生这种情况的内存泄露,往往都是因为 RecyclerView 的 Adapter 活的比 RecyclerView 要长导致的,解决方法很简单,在 Activity 或 Fragment 的销毁方...原创 2018-04-29 12:27:03 · 450 阅读 · 0 评论 -
react-native-router-flux的使用
react-native-router-flux 是一个基于 react-navigation 路由框架,进一步简化了页面跳转的步骤,并且一直随着 react-navigation 升级更新版本。而且使用这个框架的话,可以将全部的页面跳转的处理逻辑都写在一个地方,方便了后续的维护。先来个简单的demo如何导入 react-native-router-flux 这个可以看官网,...原创 2018-03-26 00:06:27 · 6176 阅读 · 8 评论 -
react-native-vector-icons的集成心得
不知道何时开始, iconfont 成为了 App 开发的利器,不仅因为它是矢量图标,可以轻松解决图标适配和颜色问题,而且它是以字体文件的形式存在项目中,比起常规图片更能节省 App 的体积。 而 react-native-vector-icons 是在 GitHub 上最火的 React Native 的 iconfont 图标库,也是这文章的主角。react-native...原创 2018-03-12 00:38:38 · 18772 阅读 · 3 评论 -
Android 中 使用 IconFont
在上篇 react-native-vector-icons的集成心得 中简单了介绍了什么是 IconFont 以及如何在React Native 中使用,这里再开一篇来具体说明什么是 IconFont 并且总结一下在 Android 开发中如何使用。什么是 IconFontIconFont 其实就是将若干个 SVG 矢量图的做成了字体文件 ( .ttf ) ,供开发者使用。 ...原创 2018-03-15 20:24:10 · 2056 阅读 · 0 评论 -
神奇的ActivityLifecycleCallbacks
Android自 API 14开始引入了一个方法,即Application的 registerActivityLifecycleCallbacks 方法,用来监听所有Activity的生命周期回调。通过这个方法,我们可以轻松获取到当前运行的 Activity 的实例,还可以判断应用是在前台运行还是后台运行。我们先来看下面的一个简单代码块:public class MyApplicat原创 2018-01-20 18:28:55 · 246 阅读 · 0 评论 -
说说webView与JS的交互方式
大家对于Hybrid App应该都不会很陌生,它主要就是指native和HTML5混合开发。Hybrid App能让前端,Android和iOS都同用一套界面和逻辑,大大降低了开发和维护的成本,因此Hybrid App在移动应用开发领域占有了一席之地。 而在Android端里面,开发Hybrid App主要是使用webView控件,webView加载的HTML5网页里面有很多逻辑都是放在JS原创 2018-01-28 18:49:08 · 469 阅读 · 0 评论 -
Android内存监听的方法
Android 系统提供了 ComponentCallbacks 和 ComponentCallbacks2 这两个接口让开发者去监听 App 的内存变化 ,其中 ComponentCallbacks2 仅可用于 Api 14 以上的版本。 我们可以在 Application,Activiy,Service 和 ContentProvider 中重写接口方法来实现内存变化的监听。...原创 2018-06-18 20:29:47 · 3975 阅读 · 0 评论 -
DataBinding的使用心得
这篇以前在简书写的blog,由于已经不会在简书写东西了,就搬过来这边前言在项目中使用到了DataBinding,深感它的优秀,于是进行分享。什么是DataBindingDataBinding,数据绑定,可以直接在xml中绑定数据并实现一些处理逻辑,实时动态刷新数据。它的功能强大,可以节省很多手写的代码,而且性能也很好。DataBinding的优点和缺点优...原创 2018-06-30 18:21:18 · 2627 阅读 · 0 评论 -
DataBinding的双向绑定
这篇之前在简书上面发布的blog,由于不打算在简书上面写东西了,就搬过来这里。之前曾经发布过一篇blog来记录之前使用DataBinding的一些心得体会,当时对于DataBinding的双向绑定简单提了一下。现在对这个双向绑定有了进一步的了解,于是继续分享。回顾我们先来回顾一下之前双向绑定的做法:<EditTextandroid:layout_width="m...原创 2018-06-30 18:23:18 · 4992 阅读 · 0 评论 -
okhttp的拦截器
okhttp 其实就做了 3 个操作,分别是 请求(call) ,TCP 连接(Connection) ,数据流(okio),这 3 个操作都是通过 okhttp 的拦截器来完成的okhttp 的拦截器到底是有些,我们可以在 opkhttp3/RealCall 里面的一个方法看到:Response getResponseWithInterceptorChain() throws IOExc...原创 2018-12-03 21:49:50 · 210 阅读 · 0 评论 -
Java 中的代理模式
为其他对象提供一个代理对象,从而让其他对象操作该代理对象来间接完成对某个指定对象的访问,这个就是代理模式。而在 Java 中,针对代理对象的创建方式,又划分了 静态代理 和 动态代理静态代理代理模式的一个特征就是 代理类和指定对象有着同样的方法调用,因此一般都是通过接口来设计代理模式。首先定义个接口:public interface Subject { void req...原创 2018-11-25 23:14:46 · 147 阅读 · 0 评论 -
动手写一个AspectJ的gradle插件
越是深入学习 Android ,就越发感觉到 Gradle 这个构建工具十分强大, Android 插件化都是依赖于 Gradle ,因此有必要学会怎么用 Gradle 来编写插件,从而进一步去理解 Gradle 的自动化构建过程。 由于我同时对 AspectJ 十分感兴趣 ,这里就总结一下我是如何把 AspectJ 做成一个 Gradle 插件 的过程。Gradle 插...原创 2018-07-28 18:59:30 · 822 阅读 · 2 评论 -
集成 Jenkins 自动化打包 Android Apk
在最近的 Android 开发中,每次发布版本都要手动打包,深感到不便,为了让测试的人员也可以感受到 Android 打包的乐趣,参考了网上很多 Jenkins 进行 Android 自动打包的文章后,花了一些时间把这个环境搭建起来了。Jenkins 安装Jenkins 的可以单独运行也可以在 Tomcat 服务器中运行,不过我这里是单独运行的,首先就要到 https://je...原创 2018-07-24 22:46:22 · 1130 阅读 · 0 评论 -
Glide源码分析之with方法
Glide 是一个开源的图片处理库,源代码的学习对于我们的帮助是非常大的,不过要看源码项目总得有个流程,这里我就从 Glide.with(FragmentActivity).load(URL).apply(centerCropTransform()) .into(imageViewRes); 作为阅读流程,首先就从 with(FragmentActivity) 开始开始吧。...原创 2019-04-16 14:28:40 · 884 阅读 · 0 评论