自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 资源 (8)
  • 收藏
  • 关注

原创 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 1030 3

原创 线程切换的几个核心问题

线程切换的几个核心问题切换线程切换了什么什么设备管理了切线程的切换CPU上下文内核态,用户态如何量化线程切换引起的开销总的切换流程

2020-02-22 22:10:30 1141

原创 从Okhttp的Head中学习一种key,value的存储方式

在用okhttp的时候,我们可能会自定义一些head,一般是这么写代码 Request.Builder builder = new Builder().url(url) .addHeader(InstagramWebConstants.HEADER_ORIGIN, .addHeader(InstagramWebConstants.HEADE...

2019-09-28 10:15:34 783

原创 责任链模式应用之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 392

原创 组件化通信方案第三选择

组件话通信方案Arouter WMRouter之外的选择主流通信基本原理(这里不讲解路由)2个Arouter利用注解存储实现类的path,使用的时候做下反射就可以。WMRouter虽然说参考SPI,但实现和SPI没啥关系。利用注解在编译期存储实现类的Class。甚少直接采用SPI,而且两家为何没有选择正宗的SPI呢,原因很简单,无法通过Key来查找服务,只能通过一个接口获取服务列表。没有...

2019-07-29 15:13:50 408

原创 Glide的内存缓存失效的原因之一

在Glide开启内存缓存和Disk缓存的时候,加载同一个图片url,在第一次加载成功的前提下,第二次可能会从Disk中取,无法从内存缓存中取,按经验任务这个情况不可能发生,但实际上在项目中出现了,列表一滑动,就会出现闪跳,分析是因为开了一个线程从硬盘读取并解码来获取图片.但未什么不是从内存缓存中读取.需要深入Glide的缓存原理来分析.Glide 内部的加载入口在Engile.load()方法 public <R> LoadStatus load( GlideConte

2022-03-03 18:09:20 1339

原创 利用Hander的日志优化性能

2022-01-24 16:35:47 324

原创 理解HashMap的容量为何是2的N次方

在阅读HashMap的原理文章的时候,其中有一个知识点说的是HashMap的数组长度是2的N次方,即使调用含有容量参数的构造方法,内部也会将数组长度调整到2的N次方.这么做最大的原因,是为了减少哈希冲突,尽量散列.我看了几篇文章,没有完全解释清楚为何能减少,所以我多看了几遍源码,加上根据我自己的理解,确定是利用了二进制按位与的特点假如数组长度是16,put操作的时候都是拿元素的hash key和数组长度-1进行的按位与所以获取下标的公式是:x&1111,x指hash key证明如下:

2021-11-14 09:40:08 611

原创 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 1899 2

原创 Android 实战中提高Handler发送消息的优先级

在阅读Android 绘制源码的时候,分析了绘制消息message的执行肯定优先所有的message,这个是利用handler的同步屏障机制和异步消息的原理,但是这些机制对开发者不开放的,相关方法也标注为@Hide,我猜测如果对开发者开放,那么为了使得自己的消息优先执行,绘制的消息不能抢先执行,很有可能会导致卡顿.分析同步屏障和异步消息的原理文章已经很多,大牛们分析的肯定比我透彻很多,哈哈.但是实战中,会有需求,虽然绘制这一类有同步屏障机制的消息的还是优先s执行.但在之后的消息中我们是否可以让自己的..

2021-09-21 10:07:27 1825

原创 Java动态代理原理详细解析

动态代理简介动态代理Demo动态代理导出字节码解释动态代理原理运行时创建字节码demo动态代理应用

2021-06-16 11:09:19 136

原创 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 810

原创 Flutter中 Redux和Provider的比较

在flutter中,跨组件状态共享是一个非常重要的课题,在一切皆为widget的前提下,一般的原则是:如果状态是组件私有的,则应该由组件自己管理;如果状态要跨组件共享,则该状态应该由各个组件共同的父元素来管理。对于组件私有的状态管理很好理解,但对于跨组件共享的状态,管理的方式就比较多了,这里讨论两个最火的框架,Redux和Provider。ReduxRedux 的思想来自于前端,作为andro...

2019-10-23 21:35:51 5838

原创 flutter 学习感悟

学习flutter的时候,先看了flutter实战这本书,我从头基本上看了一遍,刚开始的时候蛮有兴趣的,后来看着看着其实有点枯燥,看不下去了,中途断了一段时间,不知道是否有人和我一样的感觉,我以为我看不下去了,但后来我在github上看了flutter的开源项目,我决定换个方向,从实战项目入手,因为我此时有了一点基础,所以开始去模仿别人,基本就是敲一遍这个项目,在敲的时候,我会自主的冒出一些想法,...

2019-10-13 15:02:21 304

原创 博客排名吐槽

这几天我的博客排名经历了大气大落,昨天一会排名2万,今天排名14万。csdn博客排名不知道是什么鬼

2019-09-30 13:18:26 109

原创 从EventBus到LiveDataBus的演进之路

概述当要引入事件总线框架的时候,第一个想起的是EventBus,它的发布订阅模式带来了发布者和订阅者的解耦,感叹模式带来的艺术感,从而奠定了EventBus的江湖老大的地位,甚至后来出现的RxBus都不曾撼动它的地位,很少有项目会采用RxBus,因为使用RxBus意味你必须引入rxjava以及相关库,以及你得了解rxjava的原理,对于不使用rxjava的项目来说,成本太高了。不过事情后来有了变...

2019-09-19 18:13:24 719

原创 带生命周期的AsynsTask

其中让我们吐槽AsynsTask的一个点就是它生命周期无感知,在LifeCycle出来之前,一般都是在Activity/Fragment的onDestroy手动去掉,按照道理来说也可以,但是如果遇到一个界面有好多个AsynsTask,手动取消就不是那么优雅了,看着在onDestroy里一坨cancel方法,有种想砸键盘的冲动,但是AsynsTask已经封装好了切换线程的操作,而且内部的实现原理还算...

2019-09-16 20:59:14 169

原创 吐槽Okhttp的一个语法点

最近在看okhttp源码的时候,有个语法点我想吐槽一下,先看代码,代码在RealCall.java中 void executeOn(ExecutorService executorService) { 1 assert (!Thread.holdsLock(client.dispatcher())); boolean success = false; try ...

2019-09-12 16:26:07 136

原创 Okhttp的cookie和拦截器

在okhttp中应用cookie十分简单。只需要重写cookiejar即可。 OkHttpClient okHttpClient = new OkHttpClient.Builder() .addInterceptor(hostSelectionInterceptor) .cookieJar(new CookieJar() { ...

2019-09-11 20:58:52 747

原创 MVVM+LiveData的一个疑点

MVVM+LiveData的一个疑点之前一直用的MVP开发,最近有新项目要开发,所以想要这套方案来开发,在网上也有很多相关文章。总结了一下,对MMVM + LiveDat的使用一般有两种写法。在Activity或者fragment中 viewModel.getXXXLiveData().observe(this, new Observer<XXX>() { ...

2019-08-23 17:27:23 840

转载 如何将SVG转换成VectorDrawable XML资源

矢量图是apk的瘦身利器,如果还在哼哧哼哧压缩icon,请转svg吧,省工作量。UI设计师最好能提供svg图,这个svg不能直接拿来用,还需要转换。转换教程如下。转换教程...

2019-08-22 17:25:47 532

原创 ART 天然支持多 dex的理由

由于ART模式的存在,app第一次安装之后会进行一次预编译(pre-compilation) ,如果这时候发现了classes(…N).dex文件的存在就会将他们最终合成为一个.oat的文件。...

2019-08-17 09:40:51 211

原创 匿名内部类为何能访问外部类的变量

从学习java的时候知道匿名内部类能访问外部类的变量,那为何呢。先从一个最简答的例子开始:public class InnerTest { private int num = 0; public static void main(String[] args) { InnerTest innerTest = new InnerTest(); innerTest.inner();...

2019-08-15 23:40:31 2264 1

原创 Native世界的Handler

Native世界的Handler在之前一篇文章里,曾讲过,Handler机制在Java有一套框架,在Native世界里也有一套。现在来分析Native 世界的Handler是怎么运作,先看下类图。角色和Java世界差不多,但是没有MessageQueue,这个后面分析。先找个切入点,那么就以nativePollOnce为切入点。nativePollOnce的方法在android_os_Me...

2019-08-15 18:15:27 223

原创 Handler 机制的核心要点

Handler 机制的核心要点延时消息是怎么处理的如何处理消息队列为空的情况。native,java两个世界的消息通信的区别和联系主线程的Loop在哪启动handler内存泄漏的原理后续针对每个问题详细分析。只了解handler,loop,messageque是干嘛的,这是不够的。...

2019-07-31 12:22:49 476

原创 超级简单的Recyclerview 侧滑删除,无缝接入。

前提说明最近遇到了一个需求,要添加recyclerview侧滑删除的功能,本着不重复造轮子的精神,google一通,https://github.com/yanzhenjie/SwipeRecyclerView 这个库写的非常牛逼,基本上覆盖了测滑需求。但正因为他的优点,我只是想做一个测滑删除功能,不需要其他功能,所以引入有点代价。再加上他重写了recyclerview,总有点不放心,可能心理原...

2019-07-19 15:39:43 4244 4

原创 Dagger 之外的第二个选择

android中有关注入的开源项目主要有Dagger2,还有Arouter,但arouter不是专门去做注入的工作,暂不比较.Dagger2比较优秀。在android中MVP是最合适使用依赖注入的场景。但Dagger2有一个缺点,就是比较繁琐,项目injectMVP就是简化这个过程,达到轻量级的效果。

2019-06-26 15:29:15 152

原创 自动生成tag的快捷方式

添加日志的时候,有个地方很头疼,就是得手写一个tag,Android开发的同学都知道,为了简化这个,可以在android stduio 中添加一个模板,自动生成,就像当年的eclipse的sysout,哈哈。记录下怎么配置的。so 酸爽...

2019-06-25 17:15:59 1773

原创 Handler的一个坑

如果有延期执行任务的需求,我们经常用handler的postDelay方法,但这个方法容易造成内存泄漏,因为啥,这里不展开,老司机都知道。但为了解决Handler的内存泄漏的问题,我们一般会再onDestroy或者onStop执行removeCallback的方法。具体的调用如下:postDelayed中传入test字符串,是将它作为callback的一个token。public class...

2019-05-09 12:28:54 937

原创 App 性能优化

App 性能优化在开发项目的过程中,会遇到一系列的问题,其中性能问题比较关键,首先肉眼看到的就是用户的体验不好,其次会影响一个App的口碑,留存,下载量等等问题。那性能具体指哪些方面呢?主要是内存,流畅度,电量,流量,这里给大家推荐《腾讯TMQ-移动性能评测和优化》这本书,推荐理由是:系统的梳理性能优化的知识点,这本书立足于实战,解决问题,不像一些文章没有营养,老生长谈。我举个例子,电量优化这点...

2019-02-02 15:44:57 164

原创 Java 内存模型的总结

看了几遍《Java 并发编程的艺术》,对Java内存模型JMM的理解加深了不少,记录一下自己的理解吧。概念:java线程之间的通信由JMM来控制,决定一个线程对共享变量的修改何时对另外一个线程可见,抽象的说:共享变量存储在主内存中,而每个线程由一份本地内存,存储了共享变量的副本。如下一张图:JMM如何控制呢。答案就是JMM有一条规则保证,这套规则就叫Happens-before规则...

2019-01-29 14:04:02 182

原创 final 和 volatile的关系

之前的一片文章final 变量可变欠下了一个技术债,就是反射修改final变量值,到最后调用了Unsafe.putObjectVolatile方法,看方法名字中包含了"Volatile",那么推论Volatile和final有渊源,或者说在内存语义上有关联。那么这种关联是什么呢,下面来分析一下。先我们看一些概念。volatile变量写的概念如下:在Java 并发编程这本书中,写到如果对一个vo...

2019-01-24 10:05:48 1889

原创 final 变量可以修改

在之前java 开发的认知中,final 修饰的变量一旦初始化,就不能被修改,如果是类变量,只能在构造方法中初始化,在其他方法中如果初始化,编译器也会报错,IDE也会拒绝编译。如下:这个没问题,这是所有开发者的共识,但是如果遇到了反射,会有些不同,如下:public class OneCity { private final ArrayList<String> name...

2019-01-23 16:19:16 11044

转载 Android:手把手带你 深入读懂 Retrofit 2.0 源码

前言在Android开发中,网络请求十分常用 而在Android网络请求库中,Retrofit是当下最热的一个网络请求库Github截图今天,我将手把手带你深入剖析Retrofit v2.0的源码,希望你们会喜欢请尽量在PC端而不要在移动端看,否则图片可能看不清。 在阅读本文前,建议先阅读文章:这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)目录...

2018-09-18 10:49:59 127

原创 解决小米手机不兼容Instant Run

Android stduio 有一个功能Instant Run非常好用,用的增量编译,可以减少编译时间,如果项目大的化,效果会更明显。但有一个很恼人的问题,因为我平时用小米手机测试,结果在小米手机上用不了这个功能,提示一堆卸载然后重新安装的信息。解决这个问题也简单,在小米手机的开发者模式中,取消叫MIUI优化的功能,取消后,提示重启。等重启之后,在使用Instant Run,就完全OK了。减少项目

2017-06-02 20:09:45 3790 3

原创 利用反射,注解获取建表的sql

前言:因为项目很老,还是用的原生sqlite,因为建表还是手动构建sql,cursor转bean或者list都不灵活,特此用反射和 注解做了优化处理

2017-03-06 15:12:08 623

原创 Android 兼容性问题

Android 兼容性问题整理,持续更新1.vivo手机默认把快捷方式关闭了,基本上在这个手机上创建快捷方式是行不通的,金立更狠,连快捷方式的管理都不提供,直接干掉。无解 2.三星手机调用手机拍照后出现横竖屏切换的问题。 解决方案:public static int getPictureDegree(String path) { int degree = 0; try

2017-02-06 10:59:53 2792 4

原创 zxing 二维码扫描流程分析

网上有很多zxing 的扫描解析,但很少分析摄像头怎么和扫描过程联系,所以我自己看下zxing demo的源码,做了下面的总结,防止自己忘记。项目结构,CaptureActivity是zxing的主activity,分析过的朋友知道,布局文件有个surfaceView,绘制摄像头的取景框。CaptureActivty实现了SurfaceHolder.Callback 。初始化摄像头和绘制工作就在

2016-12-31 17:10:22 2554 3

原创 RecyclerView 实现点击的另外一种方式

1.前言:之前一直采用流行的方式来给RecyclerView的item设置点击方法,类似这样   @Override    public ViewHolder onCreateViewHolder(ViewGroup viewGroup,  int viewType) {        View view = LayoutInflater.from(viewGroup.getC

2016-08-29 11:59:06 751

原创 MyEclipse6.5配置Tomcat7.0不可少的一项配置

打开window>>Preferences>>MyEclipse Enterprise Workbench>>Servers>>Tomcat>>Tomcat 6.X>>Paths树形目录,在右边Prepend to classpath处点“Add JAR/ZIP”按钮,添加JAR包“D:\Tomcat7\bin\tomcat-juli.jar”.不然的话会报 classnotfoundExce

2014-03-15 13:36:11 836

sqlite 注解获取建表sql

在sqlite 中,利用注解,反射,将jave bean转为建表语句。利用反射将cursor构建bean或者list.

2017-03-06

注解获取建表sql的demo

注解获取建表sql的demo

2017-03-06

struts2讲义

满不错的入门struts讲义,关键技术讲解透彻

2012-09-09

JAVA ME 游戏开发

JAVA ME游戏开发J

2012-04-19

CSS style属性大全

CSS style属性大全,使css使用起来不在一头雾水

2012-02-14

DIV+CSS完美布局

DIV+CSS完美布局入门,使布局不在难,网页更简洁漂亮

2012-02-05

css彻底研究

讲解CSS布局,CSS的核心机制,排版,整体页面的布局方法

2012-02-05

excel基础入门快速教程

excel 速成教程,短短十天就学会,excel 速成教程,短短十天就学会,

2012-02-05

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除