- 博客(350)
- 资源 (60)
- 收藏
- 关注
原创 完全理解 java操作数栈和局部变量表
概要近期学习到字节码操控框架ASM,其中对方法的定义需要设置最大操作数栈和局部变量表。于是,自己又复习了一遍java栈帧的概念。如果对栈帧概念还不了解的读者推荐看下此文章:详细解析Java虚拟机的栈帧结构例子综述本文将会通过诸多字节码的例子,来具体分析在不同情况下的方法的操作数栈和局部变量表。本文的分析主要基于javac和javap的使用:首先用javac生成java文件编译...
2020-04-05 09:30:43 2056 1
原创 动态编译入门(gradle Transform Demo)
概述现在市面上的插件化框架,热修复框架几乎都使用了动态编译技术。动态编译的实质是,使用gradle transform api,在项目构建过程的class文件转成dex文件之前,通过自定义插件,进行class字节码处理。本文主要是通过走一遍简单Demo实现流程,让读者能对动态编译有一个大概的了解。如对一些细节知识有更多需求的读者就需要自行学习了。简单Demo本文的Demo,通过动态...
2020-03-29 10:29:58 1866
原创 编译时注解 AbstractProcessor (Activity路由Demo)
概述前一篇文章已经整理过注解的一些概念,也是附上了运行时注解的Demo,如果对注解概念不是很熟的读者建议先看下前一篇文章:android 注解入门(Acitivity路由demo)此篇文章主要讲一下编译时注解的使用,同时也是以”Activity路由“的Demo为例子。本篇的Demo主要是演示了使用编译时注解来创建文件的功能。主要模块anotationrouter:创建注解pro...
2020-03-22 16:26:04 2652 1
原创 android 注解入门(Acitivity路由demo)
参考《Java编程思想》概述近期接触了路由和模块间通信的内容,发现Java注解非常常用。避免后面看各源码被其阻塞,大致了解了下,作此文记录之。注解类型@Target@Retention@Documented@Inherited@Target用于描述注解的使用范围,可能的ElementType参数如下:CONSTRUCTOR:用于描述构造器FIELD:用于描述域L...
2020-03-14 16:50:55 724
原创 bindService 源码解析(为什么是异步)
概述Andromeda 源码解析 (同步获取服务):https://xujiajia.blog.csdn.net/article/details/104166843前一篇文章分析了Andromeda的源码,其中提到,bindService获取IBinder对象的操作是异步的。那么为什么会是异步的呢,其中做了哪些操作呢?此文会围绕这个主题展开。在此推荐下看Android源码网站:htt...
2020-02-05 21:00:46 2341 1
原创 Andromeda 源码解析 (同步获取服务)
AndromedaAndromeda是爱奇艺开源的适用于多进程架构的组件通信框架。github地址: https://github.com/iqiyi/Andromeda其特点如下:无需开发者进行bindService()操作,也不用定义Service,只需要定义aidl接口和实现同步获取服务。抛弃了bindService()这种异步获取的方式,改造成了同步获取生命周期自动管理。...
2020-02-04 21:56:02 2706
原创 Android实现 曲线路径动画
本文参考https://www.jianshu.com/p/fea4d1f6512a概述近期碰到曲线动画的实现问题,写本文记录下。动画类似“剑与远征”游戏的金币动画,动画路径如下图:思路通过贝塞尔曲线计算出x和y的位置(各个点的位置需要自己微调)(此部分内容参考此文:https://www.jianshu.com/p/fea4d1f6512a)通过ValueAnimator...
2020-02-03 21:16:03 4868
原创 ViewTreeObserver 监听View的状态
官方文档https://developer.android.com/reference/android/view/ViewTreeObserverv概述近期碰到要再OnCreate中获取View绘制结束之后的宽高,用到了ViewTreeObserver.OnGlobalLayoutListener。鉴于ViewTreeObserver的确比较实用,于是写本文记录下。官方描述A v...
2020-02-03 21:15:47 1852
原创 微信分享报错 checkArgs fail, thumbData is invalid (bitmap压缩)
概述近期使用微信分享碰到报错:checkArgs fail, thumbData is invalid查阅文档后发现是因为分享缩略图的大小不可超过32kb。于是在框架里加入了压缩图片的逻辑。源码压缩逻辑很简单:查看数据是否超过限制,如果超过就将bitmap质量再减一半。 /** * Bitmap转换成byte[]并且进行压缩,压缩到不大于maxkb * ...
2020-01-11 08:25:33 1166
原创 fresco webp动图只播放一次
概述本文适合类似于以下这些需求:要求webp动图播放一遍后就暂停要求webp动图播放一遍后就消失要求webp动图播放一遍后做其他逻辑具体实现在ControllerListener中将Animatable对象转化成AnimatedDrawable2通过AnimatedDrawable2获取到webp的总帧数每执行一帧记录一次,当记录的帧数等于总帧数的时候认为动画播放了一遍...
2020-01-11 08:01:19 2898
原创 android 自定义圆角button(自定义View Demo)
概述在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等。针对这样的场景,直接使用创建多个shape,定义多个xml文件也是可以实现的。但是如果使用非常频繁,那么直接自定义一个就会来的非常方便。甚至在一些情况下,不是可以用shape定义的规则图形,比如需要用到贝塞尔曲线等。如果全局需要这样风格的view,那么自...
2019-12-25 20:52:31 1598
原创 RemoteCallbackList源码解析
概要之前已经写过了RemoteCallbackList的使用,此文就不讲demo了。对RemoteCallbackList的使用有兴趣的读者可以看笔者之前的文章:android Binder 实现异步回调官方描述Takes care of the grunt work of maintaining a list of remote interfaces, typically for t...
2019-12-14 10:34:07 1668
原创 android 腾讯X5 首次安装App 无效问题 (webview报错TypeError)
问题腾讯X5 webview在两种情况下使用,在首次启动会有问题:1、应用启动后马上调用webview2、新启一个进程使用webview,并且在新进程中初始化X5此问题只会在首次安装的时候出现,第二次启动App的时候就不会有问题了。报错如下: TypeError: Cannot read property 'getExtension' of null原因首次安装本地没有X5内...
2019-11-27 20:35:10 3569
原创 android使用gradle优化多module的依赖管理
概述在一个项目有多个module 的时候,不可避免的会存在不同的module会有相同的依赖的问题。最一般的做法,我们开发要引入一个依赖的时候,就去看一下其他项目依赖了哪个版本,然后复制粘贴。但是一旦发现其他多项目对同一个库,存在依赖多个版本的时候,也就不知道复制哪个了。碰到这种情况,就只能增加沟通成本了。针对这种情况,我们可以对依赖增加一个统一的版本控制。这样即使是刚参与开发的同事也能不需...
2019-11-23 14:21:27 2416
原创 android 保存图片(视频)到相册
概论没有什么技术,主要记录下功能的实现。此功能实现步骤如下:将图片存储到手机picture目录下。(一般是从原位置复制过来)发送广播触发相册扫描逻辑。本文的例子是将应用自带的内容存储到picture目录。笔者看到目前市场上一些app有直接存储到DCIM目录下的。也是可行的,但是笔者个人认为最好还是只有相机相关功能生成的图片与视频存储到该目录下,否则就用户体验来讲可能会让人比较奇怪...
2019-11-23 10:27:16 7262 1
原创 android 不规则图形排列和点击事件(触摸事件)处理
概述android偶尔会有排列不规则图形的需求,比如平行四边形,梯形等。对于这些图形,往往会有点击、动画等需求,需要在View本身的绘制和触摸事件上都做一些单独的处理。本文以平行四边形为例子,记录下对不规则图形的处理。demodemo主要实现了平行四边形的排列和点击。主要实现过程:重写onDraw,在矩形的View区域中只画出平行四边形的内容。(最终显示效果中,多个View是重叠...
2019-11-10 09:12:21 2221
原创 android webview拦截加载离线文件
概述客户端经常会通过使用webview来用H5实现一些ios与android双端都有的功能,最常见的比如一些活动页面,内部广告页面等。这些页面大概会有以下几个特点:要求webview快一些,白屏时间不要太长要求能够动态更新(因此不能写死在app包中)动态更新不会很频繁对于这种场景,客户端可以再webview展示之前提前拉取需要展示的内容。(一般会是直接拉取zip包到本地解压,当然也...
2019-11-09 12:20:17 1941 1
转载 android binder 要点记录
转载自http://gityuan.com/2015/10/31/binder-prepare/https://www.zhihu.com/question/39440766android 为什么要用binder(1)从性能的角度数据拷贝次数:Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,但共享内存方式一次内存拷贝都不需要;从性能角度看,Binder性能仅...
2019-11-09 09:25:18 306
转载 fresco要点记录
本文参考https://github.com/facebook/frescohttps://juejin.im/post/5a7568825188257a7a2d9ddb概述近期使用到fresco,各要点总结记录下。本文内容多为转载或翻译。官方描述特点fresco官方的描述中主要有以下几个特点:原生的bitmap在被渲染出来后,native的资源就会被回收。这个操作是在UI线程...
2019-11-09 09:10:25 400
原创 rxlifecycle bindUntilEvent源码解析
概述rxjava使用时有个常见的问题:我们经常会在onNext中执行一些ui操作,当执行完耗时操作触发onNext的时候,Activity有可能已经destory了,我们期望是就不去执行onNext中的内容了。这种操作使用rxlifecycle来实现非常容易,只需一行代码即可:observable.compose(this.<String>bindUntilEvent(Acti...
2019-11-03 15:00:13 1452
原创 使用RecyclerView解决滑动冲突(RecyclerView添加header)
概述在android平时开发中,经常会碰到同一个页面中有多个list的问题,或者需要再一个list中存在静态布局需要与list一起滚动的的需求。针对这些情况,笔者尝试过多种方法,如:scrollView嵌套recyclerView,recyclerView嵌套recyclerView等。(主要工作量是在对分发事件的控制)最终还是认为使用单独的一个recyclerView最为实用,主要优势如下...
2019-11-03 11:42:53 2001
原创 Android模块化-模块间通信(AOP实践)
概述关于项目模块化之前已经写文章详述过,如对这方面不了解的读者可以参考笔者的这篇文章:Java模块化什么是模块间通信对于一般的项目来说,独立模块之间不会相互依赖,如下例子:比如此时有四个模块,主模块,base模块,登录模块,游戏模块。依赖关系应该如下:base模块依赖:无登录模块依赖:base模块游戏模块依赖:base模块主模块依赖:base模块、登录模块、游戏模块如上面例...
2019-10-19 11:25:19 1260
原创 Android动画总结 (valueAnimator、objectAnimator、AnimatorSet、PropertyValuesHolder、Interpolator)
参考官方文档:https://developer.android.com/guide/topics/graphics/prop-animation#api-overview概述笔者近期接触到android动画,将诸多概念都稍微整理了一下。一方面做一个知识的记录,另一方面也给刚接触android动画的初学者一个参考。主要内容ValueAnimatorObjectAnimator(包...
2019-10-13 10:42:38 1718
原创 android Binder 实现异步回调
场景描述此时有A、B两个进程,期望A与B实现进程间通信,并且在逻辑执行完毕后再A进程触发回调。期望过程如下:A进程 调用function()B进程 触发function()B进程 调用callback()A进程 触发callback()执行效果笔者demo中通过打log来记录方法的执行。执行过程大致如下:主进程 bindServiceremote进程 执行function...
2019-10-13 09:12:23 3444 4
原创 Android 可自由拖动的View
概述近期写过一个可自由拖动的View。需求是能在屏幕中随意拖动这个View,然后如果View最终停止在屏幕左边就想左边靠边,如果停止在屏幕右边就向右边靠边。本文是直接把该控件设置成了一个View。也可以使用PopupWindow来做。本人使用到的场景需要根据父布局来隐藏和显示,所以就不适合使用PopupWindow了。注意:这个View适合隐藏了ActionBar的情况,如果没有...
2019-10-07 12:00:05 1999 5
原创 Android Fragment事件透传
概述近期使用Fragment,需要将事件透传到下层(可能是Activity,也可能是其他Fragment),于是作此文记录之。原理其实很简答,就是让Fragment布局中ViewGroup都会将触摸事件传递到下层。主要是通过重写dispatchTouchEvent方法来实现。需要注意的是,如果Fragment布局中嵌套较多,那么每一层都需要重写dispatchTouchEvent这个方法。...
2019-10-07 10:52:28 1900
原创 Android针对快速点击事件的处理
概述当对一个按钮快速点击的时候,往往很可能会多次触发同一个逻辑,在有些场景下,会显得极度不合理。而且,这种情况在性能较低的手机上触发概率更高。比如,点击一个按钮打开登录页面,如果用户点击过快的话,完全可能会跳出两个登录页面。个人总结了一下针对这种情况的几种处理方式,如有问题或者其他更好的方式可以评论交流。处理方式第一次点击后,让点击事件失效这种情况更适合于一些耗时的操作,比如网络操作等...
2019-10-07 08:45:04 2169
原创 coodinatorlayout第一次点击无效的问题
问题描述coodinatorlayout使用AppBarLayout+滑动布局(使用appbar_scrolling_view_behavior),会存在“滑动后第一次点击无效的问题”。(这里的滑动布局可能是nestedScrollView,ScrollView,RecyclerView,ListView等)经查看后,发现在这样的布局中,当滑动布局滑动的时候,有时候滑动布局会一直处于flin...
2019-10-07 08:25:14 1126
原创 android为什么要用EventBus
概览近期接触到EventBus,发现其对于android开发来说其实是一个很有必要的知识要点,但是之前由于项目限制,一直没有机会使用,也不知其作用。网上对于EventBus使用详述的文章有很多,本文就不谈使用了,仅谈为什么要用EventBus。本文各个例子都是为了方便读者理解所写,但是各场景不一定使用EventBus最为合适。如有问题,欢迎评论指出。Activity之间通信一般来讲...
2019-09-22 09:33:49 1611 1
原创 SparseArray 源码解析
前言在Android开发中,在key为Integer的情况下,都建议不用HashMap,使用SparseArray替换。SparseArray与HashMap相比究竟有什么好处呢?概要个人认为两者主要有以下几点区别:SparseArray 比HashMap更轻量,更节省内存。SparseArray的速度肯定比HashMap慢,但是在数据不多的时候,这点速度可以忽略不计。源码解析...
2019-09-08 10:42:05 637
原创 TreeMap 红黑树 源码解析
概念红黑树是一种平衡二叉搜索树。它可以在O(log n)的时间内完成查找,插入和删除。二叉搜索树: 左边的节点都小于父节点,右边的节点都大于父节点。平衡二叉树: 任意左右两个子树的叶子节点的高度相差不超过1。关于二叉树的分类可以看笔者的这篇文章:一句话弄懂常见二叉树类型分成这两个概念来看,红黑树就非常好理解了。二叉搜索树的特性非常容易满足,每次在添加新节点的时候如果小于当前节点,...
2019-08-23 15:32:13 2764 1
原创 ReentrantLock和AQS 源码解析
概要ReentrantLock是一种经常会被用来与Synchronized比较的一种同步机制,其在Java中的应用也十分广泛,比如最常见的BlockingQueue就是使用了ReentrantLock来实现的同步机制。个人认为ReentrantLock和Synchronized的区别主要有以下三点:ReentrantLock等待可中中断ReentrantLock可以实现公平锁Reen...
2019-08-21 22:09:04 484
原创 自定义网络协议总结
为什么要自定义网络协议?目前网络通信常用的应用层协议已经有了HTTPS和HTTP,为什么还要自定义协议呢?个人认为主要有两个好处:更加安全。目前网络上最常见的攻击手段就是抓HTTP/HTTPS包,如果自定义网络协议,抓包工作无法使用,能避开大部分来自于脚本小子的攻击。当然对于直接在TCP/IP层的攻击还是需要由网络协议本身的安全来保证。更加轻便。HTTP/HTTPS在业务上绝对已经...
2019-08-04 09:15:21 3605
原创 netty 长连接 demo
概要近期接触netty长连接方面,实现简单demo记录,主要实现以下内容:使用HashMap存储Channel,保证需要的时候可以根据key获取到。被HashMap存储的长连接实现心跳机制。demo中是以id为key存储在HashMap中,解析内容用到了Gson。为了让demo更容易理解,没有实现粘包分包的逻辑,一旦发生会有问题。对粘包和分包有兴趣的可以看下笔者的另一篇文章:So...
2019-07-20 10:11:33 1006
原创 netty write 和flush 源码解析
本文参考:https://www.jianshu.com/p/1ad424c53e80概要netty中每次write之后都需要flush才能将消息发送出去,代码如下。笔者很好奇为什么一定要分成write和flush两个方法——既然每次都需要调用flush,直接由框架自动去调用flush不就好了吗?于是就去看了源码,写此文记之。public void channelRead(Chann...
2019-07-13 15:17:24 2497
原创 netty ByteBuff 详解
本文参考:https://segmentfault.com/a/1190000015104849概要netty的ByteBuff是用来替代nio的ByteBuffer的,与nio的ByteBuffer相比有诸多优势,主要有以下几点:扩容问题ByteBuffer长度固定,分多了会浪费内存,分少了会数组越界。如果发现存储的数据大于ByteBuffer的长度,那么就需要创建一个新的Byt...
2019-07-13 12:09:14 1963 1
原创 Java内存模型和Volatile
Java内存模型为了提高代码的执行速度,Java内存模型中有两个优化方案:1、每个Java线程会有一个工作内存,工作内存中的内容会在一定条件下同步到主内存。为什么工作内存可以提高代码的执行速度?从硬件上来看CPU的速度>内存的速度。每次CPU去内存中读写数据的时候,CPU一般都是阻塞的,需要等内存执行完毕后CPU才会继续执行。Java工作内存可以认为是CPU高速缓存,那么就能避...
2019-06-29 18:20:53 440
原创 Java内存区域
概要近期看知乎脉脉上其他人对Java知识的讲解,发现自己居然连Java内存区域的各种内容都记不太清了。遍历博客文章的时候发现也没有这方面的记载,好像都记录在毕业前面试小本子上了。之后可能会开始捡起一写Java基础知识,也是温故而知新吧。本文参考《深入理解Java虚拟机》Java内存区域图图片摘自《深入理解Java虚拟机》Java内存主要区域:程序计数器虚拟机栈本地方法栈...
2019-06-29 15:50:19 314
原创 ios wkwebview uiwebview流程图
概要当前开发涉及ios webview知识,其各方法的执行流程会经常用到,因此整理成了两张图供参考。wkwebview流程图uiwebview+NSURLProtcol 流程图uiwebview一般会和NSURLProtcol一起使用来实现离线资源的加载。...
2019-06-29 11:07:56 930
原创 netty实现 socket demo
概要近期学习netty,写了个socket简单demo作记录,也供新手参考。由于主要记录netty网络协议的使用,demo中并没有socket粘包和分包的处理,有兴趣的读者可以自己写下,理论可以参考笔者文章:Socket粘包和分包问题netty相关理论可以参考笔者文章:netty学习小结简介使用nodejs模拟客户端发送消息。netty中使用SocketInHandler和Dea...
2019-06-29 10:56:38 4153
onMeasure简单方法 完美解决ListView与ScollView!
2016-05-22
残缺棋盘 android实现颜色填充
2016-05-17
实验四 常微分方程的数值解
2016-05-11
实验三 数值积分(android)
2016-05-08
android图片轮播效果,RollViewPager的简单使用
2016-05-06
android RecyclerView布局
2016-04-22
实验二 插值方法(android)
2016-04-22
android RecyclerView布局真的只是那么简单
2016-04-18
android RecyclerView布局真的只是那么简单!
2016-04-18
实验一 直接法解线性方程组(android)
2016-04-14
android 自定义控件(底部icon点击效果)
2016-04-08
android ContentResolver的使用(获取和修改联系人信息demo)
2016-04-07
android canvas\paint\path简单使用(自定义view必学)
2016-04-01
android 滑动删除的listview(自定义view)
2016-03-29
android Fragment与Activity交互,互相发数据(附图详解)
2016-03-26
android Fragment与Activity互相发数据(附图详解)
2016-03-25
android Activity的启动模式 作用简析+demo详解
2016-03-19
学生宿舍管理系统 学生宿舍管理系统
2016-03-04
Android单元测试-对Activity的测试 [
2017-08-15
Android单元测试-对Activity的测试
2017-08-14
ListView异步创建View
2017-07-14
FragmentTransaction使用全解
2017-03-03
用Scroller完成一个简单的ViewPager
2017-02-23
完全理解android事件分发机制
2017-01-12
ASP.NET 电影票信息的增删查改
2016-12-14
ASP.NET 个人信息注册页面,并跳转显示
2016-11-23
android socket聊天室——也不仅仅是聊天室
2016-11-21
android 实现FlowLayout 流线布局(自定义ViewGroup)
2016-10-18
为RecyclerView添加分页加载(上拉加载更多)功能
2016-10-11
为RecyclerView添加FootView和HeadView
2016-10-11
学生信息管理系统2222
2016-09-23
最简易的网络框架封装(新手可看)
2016-09-07
给自定义View添加xml属性
2016-08-04
快速入门android AIDL(开启多进程并进行通信)
2016-06-10
RecyclerView超简单demo(局部更新取代ListView)
2016-06-08
实验五 迭代法解线性方程组与非线性方程(android)1
2016-05-25
实验五 迭代法解线性方程组与非线性方程(android)
2016-05-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人