自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

JW的博客

hold on

  • 博客(19)
  • 收藏
  • 关注

原创 使用注解替代枚举

概述使用枚举Enum能确保类型安全,但往往会加大内存消耗,因为Enum中的枚举值是静态成员对象,相对于静态常量占用更多的内存空间。google官方在很早以前就提醒尽量少的使用枚举,并提供了注解的方式来检查类型安全,目前提供了@IntDef和@StringDef这两种注解方式。注解一、@IntDef定义注解,添加常量@IntDef(value = {AnnotationStatus.TYPE_ONE, AnnotationStatus.TYPE_TWO})@Retention(RetentionP

2020-10-22 11:53:06 1009

原创 TCP三次握手和四次挥手

TCP三次握手三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。一、握手过程刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。第一次握手:客户端向服务器发送SYN报文请求连接,报文中

2020-08-27 13:54:25 255

原创 Android 使用Visualizer获取播放音频的频率

最近项目中需要实时获取播放音频的频率,并绘制波形图,用到了Visualizer这个类,记录下其使用方法:Visualizer.OnDataCaptureListener有两个回调方法,分别是onFftDataCapture和onWaveFormDataCapture,onFftDataCapture返回的是经过傅里叶变换处理后的音频数据,onWaveFormDataCapture返回的是声音的波形数据。计算声音分贝部分代码:val readyData = readyData(fft)val inte

2020-07-21 18:28:04 2548

原创 记录RecyclerView聊天页下拉加载页面闪烁问题

在使用RecyclerView做聊天页面时下拉时,使用addAll(0, tempDatas)加载数据后页面会出现闪烁,一开始以为是动画问题,所以加了(itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false处理后,发现还是出现闪烁问题。测试发现,如果直接在数据集尾部添加数据,并不会有闪烁问题,最终定位到getItemId这个方法,该方法我在基类默认的处理是返回position作为id。而当在数据头部添加数据时,导致所有数据

2020-07-20 18:40:11 494

原创 Android 圆环进度条(带渐变)控件

效果图:核心代码package com.jw.gradualprogressdemoimport android.animation.ObjectAnimatorimport android.animation.ValueAnimatorimport android.content.Contextimport android.graphics.*import android.u...

2020-05-06 15:28:30 582

原创 Glide源码分析(一)

Glide源码分析(一)一、基本使用二、Glide.with方法Glide实例化RequestManagerRetriever#get:三、load方法四、into方法buildRequest方法构建请求requestManager.track(target, request)总结一、基本使用implementation 'com.github.bumptech.glide:glide:4.9...

2019-10-12 16:00:42 439

原创 Android 多语言处理

Android 多语言处理由于公司最近在扩展海外市场,所以新项目不可避免的要用到多语言。多语言处理也就是针对用户选择的语言环境来切换并使用不同的string资源。这次项目的具体的业务是当用户首次进入App,默认获取系统语言,如果在语言列表内,则使用该语言,否则,默认使用美式英语。UI界面类似下面,选择不同语言后,当退出页面后才去切换语言环境:一、配置不同环境的资源文件在res目录下...

2019-08-05 16:14:56 244

原创 NestedScrollView与EditText滑动冲突处理

监听EditText的触摸事件,判断当前EditText是否可以是上下滚动,如果可以滑动,则请求父控件不拦截子事件,在up事件触发时,将requestDisallowInterceptTouchEvent设置回false。etNote.setOnTouchListener { v, event -> // 控件id if (v.id == R.id.etNote &&a...

2019-08-05 14:50:59 1064

原创 Retrofit2源码分析

严格来说,Retrofit并不是一个对网络请求进行封装的框架,因为它的网络请求是通过OkHttp实现的,而实际上它是对网络请求接口的封装。

2019-05-24 14:12:10 137

原创 理解ClassLoader

ClassLoader是什么?ClassLoader叫做类加载器,具体作用是在类加载阶段将.class文件加载到jvm虚拟机中,然后转成内存形式的Class对象供程序使用。还有就是jvm在运行时并不会立即加载所有的.class文件,而是按需加载的,当执行到未加载过的类时,才对该类进行加载,不然一次性加载,估计内存都炸了。ClassLoader加载原理jvm在运行中会存在很多个ClassL...

2019-04-09 17:04:39 141

原创 CallServerInterceptor拦截器分析

在分析完ConnectInterceptor拦截器后,终于来到了最后一个拦截器CallServerInterceptor,其主要作用就是向服务器发送请求,最终返回response。还是先看下它的intercept方法:public Response intercept(Chain chain) throws IOException { final RealInterceptor...

2019-03-08 18:47:58 908

原创 ConnectInterceptor拦截器分析

在分析完CacheInterceptor拦截器后,我们再来看下ConnectInterceptor这个拦截器,其主要作用就是与服务器建立连接。直接看它的intercept方法:public Response intercept(Chain chain) throws IOException { RealInterceptorChain realChain = (RealIntercep...

2019-03-04 15:49:19 449

原创 CacheInterceptor拦截器分析

在分析完BridgeInterceptor拦截器之后,接下来我们看下CacheInterceptor(缓存处理)拦截器,还是从它的intercept方法看起:public Response intercept(Chain chain) throws IOException { // 如果配置了缓存,则通过request获取缓存,默认cache为空 Response cacheCa...

2019-02-25 14:02:28 1864

原创 BridgeInterceptor拦截器分析

在分析完RetryAndFollowUpInterceptor拦截器后,我们看下BridgeInterceptor(连接桥拦截器)这个拦截器,它的主要作用是在request阶段配置请求头信息,cookie信息等,在response阶段,处理并保存返回的cookie信息,判断是否需要进行gzip解压等。我们直接来看它的 intercept方法中的处理:public Response interc...

2019-02-20 11:05:46 777

原创 RetryAndFollowUpInterceptor拦截器分析

RetryAndFollowUpInterceptor拦截器分析在上篇文章讲解了OKHttp的基本流程后,我们来看下RetryAndFollowUpInterceptor(错误重试和重定向拦截器)的实现。不多说,我们直接看下该拦截器的intercept方法: public Response intercept(Chain chain) throws IOException { Req...

2019-02-18 15:49:54 530 4

原创 OKHttp源码分析

OkHttp源码分析OkHttp是个目前比较流行的网络请求框架,现在大部分的应用都有在用它,看了很多大佬们写的OKHttp相关的博客,在这里记录下自己的分析过程。由于OkHttp内容比较多,这篇文章主要先简单分析下OkHttp请求的基本流程。首先,在分析源码之前先看下使用OkHttp请求的示例代码:val okHttpClient = OkHttpClient.Builder() ....

2019-02-15 14:17:40 507

原创 EventBus中的SubscriberInfoIndex

EventBus中的注解处理器生成的索引类(SubscriberInfoIndex)在EventBus源码解析中的findUsingInfo方法中有说到如果没有配置索引类,那么就会调用findUsingReflectionInSingleClass方法,在运行时利用反射来获取所有被@Subscribe注解标注的订阅方法,但这种做法对应用性能会有一定的损耗,所以在3.0后EventBus提供了索引...

2019-01-31 10:23:53 304

原创 EventBus粘性事件

EventBus粘性事件普通事件都是在订阅后才可以接收到事件,如果事件的发送在订阅事件之前,则收不到事件。而粘性事件指的是在发送事件之后再订阅该事件也能收到该事件。1、发送粘性事件// 存储粘性事件的Mapprivate final Map<Class<?>, Object> stickyEvents;// 发送粘性事件public void postSti...

2019-01-30 18:47:54 656

原创 EvenBus源码分析

EventBus分析源码分析1、获取实例2、注册(register)3、反注册(unregister)4、发送事件(post)总结源码分析EventBus 是一款在 Android 开发中使用的发布/订阅事件总线框架,基于观察者模式,将事件的接收者和发送者分开,简化了组件之间的通信,使用简单、效率高、体积小!分析它的源码,我们先从获取实例入手,然后分析下它的register方法,unregi...

2019-01-30 11:53:14 161

空空如也

空空如也

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

TA关注的人

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