自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

犀利的小牛

工匠精神,精益求精

  • 博客(44)
  • 资源 (17)
  • 收藏
  • 关注

原创 Spring源码系列(五)——@Aspect源码解析

首先我们看一下@Aspect的简单实例代码首先到Config类中添加@EnableAspectJAutoProxy注解打开AOP功能@ComponentScan(basePackages = "com.kennor.test")@EnableAspectJAutoProxypublic class Config {}自定义注解StudyTrainAnnotation用于标识连接点Joinpoint@Retention(RetentionPolicy.RUNTIME)@Target(Elem

2021-12-28 11:07:53 2219

原创 Spring源码系列(四)——Bean的循环依赖注入报错流程分析

上一篇文章我们介绍了Bean的实例化过程以及相互依赖注入的情况,本篇我们介绍一下循环依赖注入报错。首先我们要改一下StudentA和StudentB的代码,具体如下:可以看到在两个类中构造方法都注入了彼此,接着我们断点看一下代码的执行流程。首先执行到StudentA的doCreateBean此时缓存中没有StudentA实例,直接走到getSingleton方法然后走到方法中的beforeSingletonCreation方法将beanName保存在singletonsCurrentl

2021-12-24 15:58:26 704

原创 Spring源码系列(三)——Bean的实例化过程

上一篇文章我们已经介绍了Spring是如何将包路径下的类信息都扫描封装到BeanFactory中了,所以接下来我们着重看一下spring是如何通过BeanFactory创建Bean的实例。以我们示例代码中的StudentA为例,看看他的实例化过程是如何的@Overridepublic void preInstantiateSingletons() throws BeansException { // Iterate over a copy to allow for init methods

2021-12-24 15:48:43 796 1

原创 Spring源码系列(二)——@ComponentScan源码解析

首先看一下本次用到的简单的示例代码StudentA用@Component注解标识Config用@ComponentScan标识,扫描的基础包路径为:com.kennor.test最后Test运行的示例代码如下:public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Config

2021-12-24 15:22:10 1472

原创 mybatis源码系列(七)—— 反射模块

首先看一下反射模块的核心类:ObjectFactory:MyBatis每次创建结果对象的新实例时,它都会使用对象工厂(ObjectFactory)去构建POJO;ReflectorFactory:创建Reflector的工厂类,Reflector是MyBatis反射模块的基础,每个Reflector对象都对应一个类,在其中缓存了反射操作所需要的类元信息;ObjectWrapper:对对象的包装,抽象了对象的属性信息,定义了一系列查询对象属性信息的方法,以及更新属性的方法;ObjectWrapperF

2022-01-01 16:43:59 561

原创 mybatis源码系列(六)—— Cache模块

首先整体看一下MyBatis中为我们提供的缓存功能相关的类:MyBatis加载配置初始化二级缓存组件的流程:查询获取缓存过程:接着我们看一下CacheKey是如何正确找到对应缓存的首先看CacheKey是怎么创建的limit默认是Integer.MAX_VALUE可以看到CacheKey主要由namspace+id,offset、limit、sql、请求参数和环境决定,然后将这些参数进行hash计算,得出hash值。接着就是判断CacheKey是否相等,

2022-01-01 16:42:51 333

原创 mybatis源码系列(五)—— DataSource模块

首先我们看一下几个关键的类PooledConnection:使用动态代理封装了真正的数据库连接对象;PoolState:用于管理PooledConnection对象状态的组件,通过两个list分别 管理空闲状态的连接资源和活跃状态的连接资源PooledDataSource:一个简单,同步的、线程安全的数据库连接池PooledDataSource的配置和初始化在示例代码中mybatis-config.xml中如下配置,采用PooledDataSourcemybatis在启动过程中会解析envir

2022-01-01 16:41:28 744

原创 mybatis源码系列(四)—— Log模块

示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.创建SqlSessi

2022-01-01 16:40:17 420

原创 mybatis源码系列(三)—— Excutor获取数据库数据的流程

示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.创建SqlSessi

2022-01-01 16:38:35 396

原创 mybatis源码系列(二)—— Mapper接口的binding流程

示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.创建SqlSessi

2022-01-01 16:37:52 241

原创 mybatis源码系列(一)—— mybatis启动配置加载

首先看一下我们用到的示例代码InputStream inputStream = new FileInputStream(new File("src/main/resources/mybatis-config.xml"));// 1.加载配置文件创建configuration对象,创建SqlSessionFactorySqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 2.

2022-01-01 16:31:42 503

原创 Spring源码系列(一)——配置Debug运行源码

1、JDK1.8版本2、spring 5.1.3.RELEASE3、安装配置gradleSpring源码下载Spring源码下载1、git clone --branch v5.1.3.RELEASE https://gitee.com/Z201/spring-framework.git2、gradle下载,gradle要JDK8的版本3、到下载的spring源码路径执行gradle命令,gradlew :spring-oxm:compileTestJava4、用idea打开spring源码工程

2021-12-24 14:59:30 1620

原创 Android优化篇之APK体积优化

在平常开发过程中,随着应用功能不断增加和版本功能迭代,APK的体积大小在不知不觉中不断增大,而APK体积大小会影响用户首次下载安装应用或更新应用的时长和流量消耗。因此,如何有效合理的优化APK的体积也是在平常开发中需要留意的。一、合理选择图片类型在APP中图片就占据了很大的一部分体积,所以图片的优化是我们必须要关注的点。平常使用到的图片类型主要有jpg、png、webp、svg等。jpg是有损压缩格式,使用的一种失真压缩标准方法,24 bit真彩色,内容比GIF丰富,不支持动画、不支持透明色。

2020-07-13 16:49:16 2338

原创 Android优化篇之布局优化

绝大部分APP的设计中,都是提供界面与用户进行交互通信,如何保证页面流畅不卡顿也成为我们需要关注的重点,本篇将介绍如何针对布局进行优化。1.捕获定位界面是否存在卡顿掉帧的情况1.1 打开Android Device Monitor工具1.2 设置要捕获的信息1.3 捕获信息点击OK后在手机上进行操作,期间的操作过程信息将被记录,捕获时间结束后自动保存到trace.html文件中。此处我的操作是捕获进入一个消息界面过程的情况。2.分析trace.html文件2.1 使用Go

2020-07-10 21:41:10 1422

原创 解决NestedScrollView嵌套RecyclerView滑动冲突导致无法正常调用加载更多功能

解决NestedScrollView嵌套RecyclerView滑动冲突导致无法正常调用加载更多功能在使用NestedScrollView嵌套RecyclerView中,首先会出现的问题就是RecyclerView滑动会出现卡顿,没有惯性滑动的效果。这时只需要调用以下方法就可以了。recyclerView.setNestedScrollingEnabled(false);这个方法主要是设置Recy...

2018-04-17 14:49:44 8979 2

原创 Android 版本更新框架——XVersionUpdate

XVersionUpdate是VersionUpdate的升级版,全面优化代码,提高兼容性和稳定性,增强用户体验,帮助我们快速实现版本更新功能。效果图——————————最近更新内容1.修复重复下载和进度条显示异常的bug2.新增取消下载功能3.修复优化评论中的其他问题。——————————1、注入依赖compile 'com.and

2017-05-23 16:35:45 18174 57

原创 二叉树的基本操作

TreeNode 类class TreeNode { int data; TreeNode leftNode; TreeNode rightNode; public TreeNode() { } public TreeNode(int data) { this.data = data;

2017-05-18 14:45:54 571

原创 PullToRefreshRecyclerView——带上拉刷新下拉加载功能的RecyclerView

现在ListView和GridView逐渐被RecyclerView替代,之前基于ListView和GridView的刷新加载框架也已经过时,这里介绍基于RecyclerView的刷新加载框架——PullToRefreshRecyclerView,先看效果。1. 在Module下的build.gradle中添加依赖compile 'com.androidkun:pulltorefreshrecycl

2017-02-09 16:55:53 15187 48

原创 Android 全局Dialog的实现方式

这里所说的全局Dialog是指无论当前应用是处于哪一个页面上,都能够及时弹出Dialog来提示用户一些信息,一般应用优先级非常高的通知。此前先查阅了网上的实现方式,大概有两种,一种是通过修改Dialog中window的type属性以及增加层叠窗口的权限,然而测试过后并没有效果,而且在6.0以及之后的版本中,想要使用增加层叠窗口的权限还需要另外做处理;另外一种是通过Service来实现的,具体怎么样没

2017-01-20 15:51:39 8663 1

原创 Android——可修改字体大小和指示器长度的XTabLayout

XTabLayout是基于design包中的TabLayout进行了功能的扩展,在保留原有功能的基础上,增加了修改选中项字体大小、修改指示器长度以及限制屏幕显示范围内显示的Tab个数。先看效果图:集成步骤:1.添加XTabLayout依赖库在app目录下的build.gradle的dependencies中添加如下引用:compile 'com.androidkun:XTabLayout:1.1.0

2016-12-22 10:09:45 29640 115

原创 Android通过SeekBar控制系统音量

通过SeekBar控制音量大小可以带来良好的用户体验并且直观地展现当前音量大小。1.自定义SeekBar样式由于系统自带的SeekBar样式一般不满足日常开发需求,所以需要我们去自定义样式。这里就简单做个示例。首先在Layout中添加SeekBar控件。 <SeekBar android:id="@+id/seekBar" android:layout_cente

2016-12-19 12:16:06 7974 4

原创 一分钟实现多文件断点续传——断点续传框架

本人先前的博客有对多文件分段断点续传的功能进行详细的介绍,如果你有兴趣可以先阅读Android多文件断点续传(一)——数据封装以及界面实现。本人在先前的基础上对代码进行了封装,本帖主要介绍如何集成封装好的框架快速实现多文件分段断点续传功能。先看效果图Github地址——————————————————————————————————————————1. 在Module下的build.gradle中添

2016-11-16 17:30:15 5079 2

原创 Android 设置Edittext获取焦点并弹出软键盘

Android 设置Edittext获取焦点并弹出软键盘editTex.setFocusable(true);editTex.setFocusableInTouchMode(true);editTex.requestFocus();activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_

2016-11-16 12:43:02 60457 4

原创 Android多文件断点续传(四)——处理网络状态变化

上一篇中我们已经介绍了如何实现多文件分段断点续传,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(三)——实现文件断点续传。本篇接着对该功能进行简单的优化,在网络状态断开的情况下能自动保存下载进度,并在网络状态恢复连接的情况下继续自动下载。首先我们需要在AndroidManifest.xml中增加读取网络状态的权限。 <uses-permission android:name=

2016-11-14 16:28:59 2148 1

原创 Android多文件断点续传(三)——实现文件断点续传

上一篇中我们主要介绍了如何实现数据库储存下载信息,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(二)——实现数据库储存下载信息。数据库我们已经准备好,现在就可以开始来实现DownloadService进行断点续传了。一.DownloadService/** * Created by kun on 2016/11/10. * 下载服务 */public class Downl

2016-11-11 18:40:16 4125 2

原创 Android多文件断点续传(二)——实现数据库储存下载信息

上一篇中我们主要介绍了数据和封装和界面的简单实现,如果你还没阅读过,建议先阅读上一篇Android多文件断点续传(一)——数据封装以及界面实现。接着我们还需要先将数据库准备好,这里用了Android自带的SQLite,对SQLite的使用一般都可以按照固定模版来实现的,具体接着往下看。一.创建DBHelper/** * Created by kun on 2016/11/10. */publi

2016-11-11 16:09:24 2549 2

原创 Android多文件断点续传(一)——数据封装以及界面实现

Android多文件断点续传在很多应用场景中都会运用到,更重要的是相对于简单的下载功能,断点续传在下载文件过程中能带来非常好的用户体验。本系列教程将围绕一个简单Demo介绍多文件断点续传的实现方式。先看效果图Demo所涉及主要内容如下:1. Service:用于后台处理下载文件的逻辑。2. SQLite : 用于保存下载进度。3. EventBus : 用于分发和接收下载进度。4. ThreadPo

2016-11-11 15:39:31 3458 7

原创 Android EditText禁止输入空格和特殊字符

有时候我们需要限制EditText输入的字符类型,如空格,特殊字符等,这时候我们可以使用系统提供的输入过滤器——InputFilter。具体实现如下:/** * 禁止EditText输入空格 * @param editText */ public static void setEditTextInhibitInputSpace(EditText editText

2016-11-04 15:16:27 28756 2

原创 Android城市选择列表(二)——快速索引

在上一篇文章中介绍了在RecyclerView中如何实现数据分组展示,如果你还没阅读过,建议先阅读上一篇Android地区选择列表(一)——RecyclerView数据分组。本篇接着在此基础上增加快速索引的功能。先看效果图这里我们需要自定义一个控件来实现快速索引。从效果图中可以发现其实要实现的界面很简单,我们一步一步来做。首先创建QuickIndexView继承Viewpublic class Qu

2016-10-26 15:33:53 14744

原创 Android城市选择列表(一)——RecyclerView数据分组

地区选择功能在APP中是非常常见的,Demo主要简单实现了快速索引选择地区的功能,本帖围绕此demo,介绍如何在RecyclerView中分组展示数据以及快速索引。先上效果图:1.虚拟数据创建一个类保存一串json格式的地区数据/** * Created by kun on 2016/10/26. * 模拟数据 */public class Data { public static f

2016-10-26 12:36:57 16116 7

原创 一分钟实现版本更新功能——APP版本更新框架

请使用升级版XVersionUpdateVersionUpdate是一个版本更新框架,帮助我们轻松实现版本更新功能。效果图 集成步骤1. bulid.gradle添加依赖库 compile 'com.androidkun:version_update:1.1.0'2. 调用下载方法并设置参数 /** * 启动下载服务 * * @param context

2016-09-18 10:40:53 7726

原创 一分钟实现图片选择功能——图片选择框架

ImageSelector是一个图片选择框架,帮助我们轻松实现图片选择功能。先看效果图集成步骤1.build.gradle 加入依赖compile 'com.androidkun:imageselector:1.0.1'2.处理按钮点击事件(初始化并弹出PopupWindow)/** * PopupWindow */private SelectMothedPopupWindow selectM

2016-09-14 10:14:49 1503 1

原创 Android内存泄漏检查利器——LeakCanary

内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元,直到程序退出,如果在程序退出前达到了系统所分配的最大内存限度时,则会触发OOM导致程序崩溃。相信大多开发者对于内存泄漏并不陌生,但是如何去发现内存泄漏、定位内存泄漏以及处理内存泄漏可能就有些生疏了。本篇将介绍如何使用Android内存泄漏检查利器——LeakCanary去发现内存泄漏以及定位

2016-09-08 11:39:04 844

原创 Android WiFi开发教程(三)——WiFi热点数据传输

在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接。本篇接着简单介绍手机上如何通过WiFi热点进行数据传输。跟蓝牙通讯一样,WiFi热点数据传输也是要运用到Socket。这里我创建了两个线程ConnectThread和ListenerThread,分别去处理数据传输和监听连接。ConnectThread** *

2016-09-07 16:15:11 22361 36

原创 Android WiFi开发教程(二)——WiFi的搜索和连接

在上一篇中我们介绍了WiFi热点的创建和关闭,如果你还没阅读过,建议先阅读上一篇文章Android WiFi开发教程(一)——WiFi热点的创建与关闭。 本章节主要继续介绍WiFi的搜索和连接。WiFi的搜索 /* 搜索wifi热点 */ private void search() { if (!wifiManager.isWifiEnabled()) {

2016-09-07 15:24:58 23117 9

原创 Android WiFi开发教程(一)——WiFi热点的创建与关闭

相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机、平板电脑和笔记本电脑都支持Wi-Fi上网。因此,掌握基本的WiFI开发技术是非常必要的。本教程将围绕一个小Demo初步与大家一同探讨WiFi开发。先上效果图 Demo功能比较简单,四个按钮、两个文本和一个列表。功能主要有创建WiFi热点,关闭WiFi热点,搜索WiFi,连接WiFi,数据通讯。源码会在教

2016-09-07 14:28:02 22278 36

原创 Android蓝牙开发教程(三)——蓝牙设备相互通讯

在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获取到的BluetoothSocket交由连接线程ConnectThread来处理。 @Override public void run() { try {

2016-09-06 11:22:10 11573 19

原创 Android蓝牙开发教程(二)——连接蓝牙设备

在上一篇中已经介绍如何搜索附近可连接的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(一)——搜索蓝牙设备获取到设备后就可以开始处理蓝牙设备之间的连接。在上一篇教程中我们将搜索到的蓝牙设备展示在列表中,现在我们为列表项增加上点击事件。listView.setOnItemClickListener(new AdapterView.OnItemClickListener()

2016-09-06 11:01:13 15848 4

原创 Android蓝牙开发教程(一)——搜索蓝牙设备

Android蓝牙功能的开发一直是很多新手头疼的问题,网上虽然也有很多教程贴,但大多都写得不全面,不能让我们真正掌握蓝牙开发的基本知识。本教程主要讲解搜索蓝牙设备、蓝牙设备之间的连接和蓝牙之间的通讯三个主要模块。掌握了这三个,基本就能进行简单的蓝牙开发了。先上效果图界面比较简单。主要有三个按钮,两个文本和一个列表。三个按钮主要对应打开蓝牙,搜索设备和发送信息三个功能。两个文本主...

2016-09-05 17:59:16 25092 13

原创 Android 自定义View——BarrageView实现弹幕功能

现在很多应用都有弹幕的功能,虽然本人没什么兴趣使用弹幕的功能,但是对如何实现这个弹幕功能还是有兴趣的。先上效果图。原理在ViewGroup上不定时地添加属性不相同的TextView执行不同的动画。BarrageView的关键代码BarrageView所需要的属性 /** * 最大的移动速度 */ private int maxSpeed; /** * 最

2016-08-11 16:51:28 3457

TinkerDemo

Tinker集成示例,具体查看http://blog.csdn.net/a1533588867/article/details/74530979

2017-07-06

Android版本升级

快速实现Android版本升级的Demo,详情请看http://blog.csdn.net/a1533588867/article/details/72650244

2017-05-24

PullToRefreshRecyclerView

Android RecyclerView上拉刷新下拉加载 详情请看: http://blog.csdn.net/a1533588867/article/details/54949058

2017-02-09

XTabLayoutDemo

Android可修改选中项字体大小和指示器长度的XTabLayout,详情请看http://blog.csdn.net/a1533588867/article/details/53810409

2016-12-27

Android SeekBar调节音量

通过SeekBar控制系统音量,具体请查看http://blog.csdn.net/a1533588867/article/details/53738027

2016-12-19

快速实现断点续传Demo

继承框架快速实现断点续传Demo,详情请看http://blog.csdn.net/a1533588867/article/details/53188953

2016-11-16

github提交流程

本人自己用的笔记。

2016-11-16

Android多文件断点续传

Demo实现多文件分段断点续传功能,详情请看http://blog.csdn.net/a1533588867/article/details/53129259

2016-11-11

快速索引选择地区

此demo结合教程所用,主要实现在RecyclerView中进行数据分组已经结合快速索引功能,如果想要直接用,需要自行添加响应事件等。详情请看: http://blog.csdn.net/a1533588867/article/details/52933145

2016-10-26

AndroidWiFi热点Demo

AndroidWiFi热点Demo,包括了创建热点,搜索wifi,连接wifi,热点通讯。详情请看http://blog.csdn.net/a1533588867/article/details/52459284

2016-09-07

Android蓝牙Demo

Android蓝牙Demo,详情请查看http://blog.csdn.net/a1533588867/article/details/52442349

2016-09-06

弹幕功能Demo

实现弹幕功能的Demo

2016-08-11

拖动条选择时间控件

拖动seekbar选择时间的自定义控件

2016-08-08

自定义带下载进度按钮

自定义带下载进度提示Button.

2016-08-08

通过拍照或相册选择图片

基于鸿洋的图片选择器(http://blog.csdn.net/lmj623565791/article/details/39943731)进行功能扩展

2016-07-29

Android自动提取短信验证码

自动提取短信验证码填入到编辑框

2016-07-27

AndroidPopupWindowDemo

Android PopupWindow 的一个小Demo

2015-08-24

空空如也

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

TA关注的人

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