Android
文章平均质量分 85
快乐的编码小猪
有梦想,敢打敢拼,愿意尝试新鲜的事物
展开
-
Glide的内存缓存失效的原因之一
在Glide开启内存缓存和Disk缓存的时候,加载同一个图片url,在第一次加载成功的前提下,第二次可能会从Disk中取,无法从内存缓存中取,按经验任务这个情况不可能发生,但实际上在项目中出现了,列表一滑动,就会出现闪跳,分析是因为开了一个线程从硬盘读取并解码来获取图片.但未什么不是从内存缓存中读取.需要深入Glide的缓存原理来分析.Glide 内部的加载入口在Engile.load()方法 public <R> LoadStatus load( GlideConte原创 2022-03-03 18:09:20 · 1509 阅读 · 0 评论 -
Android API广告反作弊需求 Native层获取 bootMark奔溃解析
之前接了一个API 广告反作弊的需求,需要客户端获取bootMark,updateMark值给渠道商,这两个值是通过JNI调用内核的boo_id值。我们的APP只打了armeabi-v7a 的so,经过测试发现,在vivo机型上遇到了奔溃,其他机型则没有问题.奔溃信息如下:2021-09-24 18:23:00.800 19123-19123/? E/aid.demoprojec: Unknown bits set in runtime_flags: 0x80002021-09-24 18:23原创 2021-09-26 11:29:06 · 2141 阅读 · 2 评论 -
Android 实战中提高Handler发送消息的优先级
在阅读Android 绘制源码的时候,分析了绘制消息message的执行肯定优先所有的message,这个是利用handler的同步屏障机制和异步消息的原理,但是这些机制对开发者不开放的,相关方法也标注为@Hide,我猜测如果对开发者开放,那么为了使得自己的消息优先执行,绘制的消息不能抢先执行,很有可能会导致卡顿.分析同步屏障和异步消息的原理文章已经很多,大牛们分析的肯定比我透彻很多,哈哈.但是实战中,会有需求,虽然绘制这一类有同步屏障机制的消息的还是优先s执行.但在之后的消息中我们是否可以让自己的..原创 2021-09-21 10:07:27 · 2013 阅读 · 1 评论 -
Kotlin告别FindViewById的原理
引子使用Kotlin引用控件的时候,不用写findViewById,直接用id即可,比如<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-au原创 2020-07-26 10:08:47 · 827 阅读 · 0 评论 -
Android 4.4 以下multi dex的crash问题
在崩溃统计平台上看到有如下的一种crashjava.lang.RuntimeException:at android.app.ActivityThread.installProvider (ActivityThread.java:4889)at android.app.ActivityThread.installContentProviders (ActivityThread.java...原创 2020-04-29 15:18:56 · 1063 阅读 · 3 评论 -
利用Hander的日志优化性能
无原创 2022-01-24 16:35:47 · 350 阅读 · 0 评论 -
ART 天然支持多 dex的理由
由于ART模式的存在,app第一次安装之后会进行一次预编译(pre-compilation) ,如果这时候发现了classes(…N).dex文件的存在就会将他们最终合成为一个.oat的文件。...原创 2019-08-17 09:40:51 · 233 阅读 · 0 评论 -
如何将SVG转换成VectorDrawable XML资源
矢量图是apk的瘦身利器,如果还在哼哧哼哧压缩icon,请转svg吧,省工作量。UI设计师最好能提供svg图,这个svg不能直接拿来用,还需要转换。转换教程如下。转换教程...转载 2019-08-22 17:25:47 · 546 阅读 · 0 评论 -
责任链模式应用之Okhttp的拦截器机制
责任链模式的概念责任链模式定义如下:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chai...原创 2019-09-11 09:03:21 · 411 阅读 · 0 评论 -
Okhttp的cookie和拦截器
在okhttp中应用cookie十分简单。只需要重写cookiejar即可。 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(hostSelectionInterceptor) .cookieJar(new CookieJar() { ...原创 2019-09-11 20:58:52 · 784 阅读 · 0 评论 -
吐槽Okhttp的一个语法点
最近在看okhttp源码的时候,有个语法点我想吐槽一下,先看代码,代码在RealCall.java中 void executeOn(ExecutorService executorService) { 1 assert (!Thread.holdsLock(client.dispatcher())); boolean success = false; try ...原创 2019-09-12 16:26:07 · 154 阅读 · 0 评论 -
带生命周期的AsynsTask
其中让我们吐槽AsynsTask的一个点就是它生命周期无感知,在LifeCycle出来之前,一般都是在Activity/Fragment的onDestroy手动去掉,按照道理来说也可以,但是如果遇到一个界面有好多个AsynsTask,手动取消就不是那么优雅了,看着在onDestroy里一坨cancel方法,有种想砸键盘的冲动,但是AsynsTask已经封装好了切换线程的操作,而且内部的实现原理还算...原创 2019-09-16 20:59:14 · 181 阅读 · 0 评论 -
从EventBus到LiveDataBus的演进之路
概述当要引入事件总线框架的时候,第一个想起的是EventBus,它的发布订阅模式带来了发布者和订阅者的解耦,感叹模式带来的艺术感,从而奠定了EventBus的江湖老大的地位,甚至后来出现的RxBus都不曾撼动它的地位,很少有项目会采用RxBus,因为使用RxBus意味你必须引入rxjava以及相关库,以及你得了解rxjava的原理,对于不使用rxjava的项目来说,成本太高了。不过事情后来有了变...原创 2019-09-19 18:13:24 · 733 阅读 · 0 评论 -
Native世界的Handler
Native世界的Handler在之前一篇文章里,曾讲过,Handler机制在Java有一套框架,在Native世界里也有一套。现在来分析Native 世界的Handler是怎么运作,先看下类图。角色和Java世界差不多,但是没有MessageQueue,这个后面分析。先找个切入点,那么就以nativePollOnce为切入点。nativePollOnce的方法在android_os_Me...原创 2019-08-15 18:15:27 · 237 阅读 · 0 评论 -
MVVM+LiveData的一个疑点
MVVM+LiveData的一个疑点之前一直用的MVP开发,最近有新项目要开发,所以想要这套方案来开发,在网上也有很多相关文章。总结了一下,对MMVM + LiveDat的使用一般有两种写法。在Activity或者fragment中 viewModel.getXXXLiveData().observe(this, new Observer<XXX>() { ...原创 2019-08-23 17:27:23 · 870 阅读 · 0 评论 -
Handler 机制的核心要点
Handler 机制的核心要点延时消息是怎么处理的如何处理消息队列为空的情况。native,java两个世界的消息通信的区别和联系主线程的Loop在哪启动handler内存泄漏的原理后续针对每个问题详细分析。只了解handler,loop,messageque是干嘛的,这是不够的。...原创 2019-07-31 12:22:49 · 486 阅读 · 0 评论 -
zxing 二维码扫描流程分析
网上有很多zxing 的扫描解析,但很少分析摄像头怎么和扫描过程联系,所以我自己看下zxing demo的源码,做了下面的总结,防止自己忘记。项目结构,CaptureActivity是zxing的主activity,分析过的朋友知道,布局文件有个surfaceView,绘制摄像头的取景框。CaptureActivty实现了SurfaceHolder.Callback 。初始化摄像头和绘制工作就在原创 2016-12-31 17:10:22 · 2572 阅读 · 3 评论 -
Android 兼容性问题
Android 兼容性问题整理,持续更新1.vivo手机默认把快捷方式关闭了,基本上在这个手机上创建快捷方式是行不通的,金立更狠,连快捷方式的管理都不提供,直接干掉。无解 2.三星手机调用手机拍照后出现横竖屏切换的问题。 解决方案:public static int getPictureDegree(String path) { int degree = 0; try原创 2017-02-06 10:59:53 · 2863 阅读 · 4 评论 -
利用反射,注解获取建表的sql
前言:因为项目很老,还是用的原生sqlite,因为建表还是手动构建sql,cursor转bean或者list都不灵活,特此用反射和 注解做了优化处理原创 2017-03-06 15:12:08 · 640 阅读 · 0 评论 -
解决小米手机不兼容Instant Run
Android stduio 有一个功能Instant Run非常好用,用的增量编译,可以减少编译时间,如果项目大的化,效果会更明显。但有一个很恼人的问题,因为我平时用小米手机测试,结果在小米手机上用不了这个功能,提示一堆卸载然后重新安装的信息。解决这个问题也简单,在小米手机的开发者模式中,取消叫MIUI优化的功能,取消后,提示重启。等重启之后,在使用Instant Run,就完全OK了。减少项目原创 2017-06-02 20:09:45 · 4020 阅读 · 3 评论 -
Android:手把手带你 深入读懂 Retrofit 2.0 源码
前言在Android开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库Github截图今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜欢请尽量在PC端而不要在移动端看,否则图片可能看不清。 在阅读本文前,建议先阅读文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)目录...转载 2018-09-18 10:49:59 · 141 阅读 · 0 评论 -
App 性能优化
App 性能优化在开发项目的过程中,会遇到一系列的问题,其中性能问题比较关键,首先肉眼看到的就是用户的体验不好,其次会影响一个App的口碑,留存,下载量等等问题。那性能具体指哪些方面呢?主要是内存,流畅度,电量,流量,这里给大家推荐《腾讯TMQ-移动性能评测和优化》这本书,推荐理由是:系统的梳理性能优化的知识点,这本书立足于实战,解决问题,不像一些文章没有营养,老生长谈。我举个例子,电量优化这点...原创 2019-02-02 15:44:57 · 175 阅读 · 0 评论 -
Handler的一个坑
如果有延期执行任务的需求,我们经常用handler的postDelay方法,但这个方法容易造成内存泄漏,因为啥,这里不展开,老司机都知道。但为了解决Handler的内存泄漏的问题,我们一般会再onDestroy或者onStop执行removeCallback的方法。具体的调用如下:postDelayed中传入test字符串,是将它作为callback的一个token。public class...原创 2019-05-09 12:28:54 · 970 阅读 · 0 评论 -
自动生成tag的快捷方式
添加日志的时候,有个地方很头疼,就是得手写一个tag,Android开发的同学都知道,为了简化这个,可以在android stduio 中添加一个模板,自动生成,就像当年的eclipse的sysout,哈哈。记录下怎么配置的。so 酸爽...原创 2019-06-25 17:15:59 · 1803 阅读 · 0 评论 -
Dagger 之外的第二个选择
android中有关注入的开源项目主要有Dagger2,还有Arouter,但arouter不是专门去做注入的工作,暂不比较.Dagger2比较优秀。在android中MVP是最合适使用依赖注入的场景。但Dagger2有一个缺点,就是比较繁琐,项目injectMVP就是简化这个过程,达到轻量级的效果。原创 2019-06-26 15:29:15 · 163 阅读 · 0 评论 -
超级简单的Recyclerview 侧滑删除,无缝接入。
前提说明最近遇到了一个需求,要添加recyclerview侧滑删除的功能,本着不重复造轮子的精神,google一通,https://github.com/yanzhenjie/SwipeRecyclerView 这个库写的非常牛逼,基本上覆盖了测滑需求。但正因为他的优点,我只是想做一个测滑删除功能,不需要其他功能,所以引入有点代价。再加上他重写了recyclerview,总有点不放心,可能心理原...原创 2019-07-19 15:39:43 · 4282 阅读 · 4 评论 -
组件化通信方案第三选择
组件话通信方案Arouter WMRouter之外的选择主流通信基本原理(这里不讲解路由)2个Arouter利用注解存储实现类的path,使用的时候做下反射就可以。WMRouter虽然说参考SPI,但实现和SPI没啥关系。利用注解在编译期存储实现类的Class。甚少直接采用SPI,而且两家为何没有选择正宗的SPI呢,原因很简单,无法通过Key来查找服务,只能通过一个接口获取服务列表。没有...原创 2019-07-29 15:13:50 · 445 阅读 · 0 评论 -
RecyclerView 实现点击的另外一种方式
1.前言:之前一直采用流行的方式来给RecyclerView的item设置点击方法,类似这样 @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { View view = LayoutInflater.from(viewGroup.getC原创 2016-08-29 11:59:06 · 760 阅读 · 0 评论