- 博客(19)
- 收藏
- 关注
原创 setWillNotDraw()方法原理
在ViewGroup中默认是不进行绘制的,onDraw()和draw(canvas)方法都不会调用,因为ViewGroup为了提升性能默认情况下是不开启绘制的,可以通过调用setWillNotDraw(false)打开ViewGroup的绘制。setWillNotDraw怎么实现的?我们知道绘制的流程是:draw(Canvas canvas, ViewGroup parent, long drawingTime)->draw(Canvas canvas)->onDraw(Canvas ca
2020-06-24 11:08:08 2454 1
原创 Record
bitmap在2.3以下版本,内存在native分配,需要主动recycle()释放内存;8.0以下分配在java heap,有垃圾管理机制统一管理,无需手动释放内存;8.0以上,内存分配在native层,生命周期跟随java对象,内存自动释放,也不需主动释放内存。...
2020-04-16 14:19:13 209
原创 RecyclerView实现悬浮吸顶、分隔线、到底提示效果
本文中所有效果均通过ItemDecoration实现,通过此实现的可以实现与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性ui,附上github地址:https://github.com/ChenSWD/EasyStickyDecoration...
2020-01-07 21:31:58 961
原创 RecyclerView中View的添加复用
本文以通俗的语言,记录在阅读RecyclerView源码时的一些心得????。添加view的过程在使用recyclerView的setAdapter方法设置adapter时,会调用RecyclerView的requestLayout()方法,进而执行measure、layout等生命方法;何时添加的子view(adapter里面的一堆):在RecyclerView执行layout时,实际会调用L...
2019-12-17 12:59:47 1407
原创 分析ConcurrentHashMap的源码实现(jdk1.8)
ConcurrentHashMap不仅实现了多线程的同步读写而且轻量级,这是它相比于HashMap和HashTable的优势。HashMap是线程不安全的,它没有提供任何的同步机制,多线程并发访问会有问题。HashTable虽然提供了同步机制,但是它是通过整个对象加锁达到同步的,是重量级的,并发性较低。下面将通过put()和get()方法,分析ConcurrentHashMap的主要实现。一、C...
2018-10-24 18:49:34 370
原创 源码分析AQS独占锁、共享锁和Condition的实现
AbstractQueuedSynchronizer是java.util.concurrent包下非常重要和基础的类,concurrent包下提供了一系列的同步操作需要的工具,包括了ReentrantLock、ReentrantReadWriteLock、ThreadPoolExecutor、CountDownLatch、LinkedBlockingQueue等等,该包下很多的工具类都直接或者间接...
2018-10-20 12:10:15 2168
原创 分析ThreadLocal的实现原理
ThreadLocal是开发中常会使用的一个工具,从类的名字就可以看出,它为线程提供本地变量,即:每个线程私有的数据。下面直接进入源码。1、使用方法:// Entity 存放线程要保存的信息ThreadLocal<Entity> threadLocal = new ThreadLocal<Entity>();//为线程设置私有数据thre
2018-10-15 11:55:57 509
原创 Gradle之持续集成 - 使用Jenkins构建Gradle项目
参考《Gradle IN Action》书中使用Jenkins构建Gradle项目过程。 持续集成(Continuous Integration,CI)是一个软件开发实践,其提倡频繁地集成代码,对于每个变化,源代码都会通过自动化构建被编译和测试,从而有效地减少集成难度,让项目中的问题今早暴露出来。Jenkins是一种开源的CI服务器。 介绍下持续集成的步骤: 提交代码->触发构建-&a
2018-09-17 10:05:41 30759 1
原创 Gradle之Gradle扩展-自定义插件以及发布
通常我们会想要将一个非常有用的task共享给多个项目使用,Gradle插件正可以解决这一问题。Gradle插件是非常强大的,如Java插件,一行代码:apply plugin: 'java',就可以使用Java插件实现代码的编译、测试和打包成JAR文件;在android中,我们经常使用:apply plugin: 'com.android.application'来加载android插件。1、...
2018-09-17 10:04:59 3892
原创 Gradle之多项目构建
Gradle对构建模块化项目提供了强大的支持,在Gradle中每一个模块都是一个项目,称之为Gradle多项目构建技术,多项目构建实现了项目模块化,降低代码耦合度,增加内聚性,本篇文章将简单介绍如何使用Gradle进行多项目构建。1、组装多项目构建:Gradle整个项目是由一个根目录和多个模块的子目录构成,在根目录下新建build.gradle构建脚本,使用gradle projects命令查...
2018-09-17 10:04:10 6200
原创 Gradle之task的使用
在上一篇文章中(https://blog.csdn.net/weixin_38062353/article/details/82230239)做了对gradle的基本介绍,本篇文章将探索最基础的gradle构建块:project和task以及它们和API之间的映射。一、构建块。每一个Gradle构建脚本中都会包含三个基本的构建块,project、task和property。每一个构建都至少...
2018-09-17 10:03:35 22703
原创 Gradle之重新认识Gradle(项目结构、命令行、task、构建Java项目、包装器)
前言:之前一直接触使用Gradle完成Android项目的自动化构建,所谓重新认识Gradle是因为最近看了《Gradle IN Action》一书,对gradle进行了一次全面深刻的重新的认识。所以决定以系列博客,来完成自己对Gradle学习之路的一个总结与认识。...
2018-09-17 10:02:44 3395
原创 ThreadPoolExecutor的使用及源码分析
ThreadPoolExecutor自己也经常使用,也看过几次源码,但是源码具体执行流程在经过一段时间之后有些就变得模糊。所以还是在此记录一下ThreadPoolExecutor源码中的关键点和自己对代码的理解。 在文章前面部分介绍一下ThreadPoolExecutor相关知识点、使用流程(该部分内容参考:https://www.jianshu.com/p/ae67972d1156,感谢其作者...
2018-09-14 13:51:05 495
原创 android可以无限循环滑动的ViewPager
前言:最近有需求需要某个页面是可以无限滑动的,这个页面是用ViewPager实现的,但是ViewPager本身并不能无限滑动,所以想在android现有ViewPager的基础之上,实现这个功能,本文提供基于PagerAdapter和FragmentPagerAdapter的可以复用view和fragment的一种实现,github地址:。分析: ViewPager滑动边界是怎么判断的? ...
2018-09-10 11:47:09 8929
原创 播放器手势:基于GestureDetector实现(双击、快进快退、音量亮度调节)
最近有个播放器手势滑动快进快退的需求,研究了一下Android中GestureDetector的用法,封装了一个工具类,实现了单击、双击、横向滑动(快进快退)、竖向滑动(亮度音量调节)手势。代码参见:https://github.com/ChenSWD/PlayerGestureDetector1、在播放器中,常用的一些功能一般有:快进快退、亮度音量调节、双击暂停/播放、单击隐藏/显示播放器的...
2018-08-29 23:42:59 3409 1
原创 android 使用ndk(socket)进程保活
最近看了动脑学院的一个ndk进程守护的课程,特在此记录一下。由于个人之前对linux系统还是有所学习的,所以代码看起来基本没什么问题,在这里主要记录一下相关主要知识点、进程保活的主要实现原理。 代码我进行了整理,可参考git地址:https://github.com/ChenSWD/ProcessKeepAliveDemo.git1.保活实现原理:在ndk层,fork()一个子进程,子进程作...
2018-08-12 22:09:01 3609 4
原创 Android 属性动画代码分析(基于ObjectAnimator)
android属性动画是开发中经常使用的一项技能,但是我之前却从没有深究过动画实现原理,本文基于android 8.0,撸了一把ObjectAnimator源码,分析属性动画执行关键的过程。一、动画执行的两个主要的问题动画每一帧执行的信号是如何产生的:是handler循环还是。。。?View的属性是怎么产生变化的:在每一帧循环中,view的属性是怎么样被改变的二、带着上述的两个问...
2018-08-11 12:04:53 702
原创 android API 26 中对 findViewById()泛型的理解
android在api 26中的findViewById方法使用了泛型,使我们在开发中免了强转类型的苦恼,今天突然冒出了一个疑问(个人在之前对泛型还没有深入理解),故在此记录一下: findViewById()怎么知道我要的是哪一种类型,也就是说它怎么能根据不同ID刚好强转成相对应的View。1.一般来说方法泛型原型是这个样子的:public <T extends View&g...
2018-08-11 12:02:45 1794
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人