- 博客(118)
- 资源 (43)
- 收藏
- 关注
原创 Netty框架的简单使用,实现socket通讯
个人博客:haichenyi.com。感谢关注 题外话,很多人都把JDK1.4提供的NIO称之为异步非阻塞I/O;其实,并不然,从严格意义上面讲,它只能称为非阻塞I/O。在JDK1.7提供的NIO 2.0,新增了异步的套接字通道Channel,它才是真正的异步非阻塞I/O。下表是不同I/O模型的对比:表1-1 几种I/O模型和同能对比 同步阻塞I/O(BIO) 伪异步I/...
2018-02-12 11:15:43 17640 1
原创 Android存储之SharedPreferences源码解析
个人博客:haichenyi.com。感谢关注1. 目录1–目录2–简介3–getSharedPreferences会不会阻塞线程,为什么?4–get操作,为什么有时候会卡顿?5–commit和apply的区别6–优化sp操作2.简介 从工作开始,Android存储数据最常见的应该就是SharePreference,但是,你真的用懂了吗?源码你看过吗?Google对sp的定位你知道吗?是不是所有数据都应该用sp来存储呢? 为什么现在面试关于sp非常常见呢?不就是一个get,p
2022-01-27 18:23:22 2713
原创 Android——MVVM之ViewModel
个人博客:haichenyi.com。感谢关注1. 目录1–目录2–前言(MVVM演变路程)3–目的4–ViewModel为什么不会内存泄漏?5–Activity屏幕旋,为什么ViewModel没有被重新创建还是使用的是之前的?6–Activity与Fragment之间数据如何共享的7–GlobeScope,viewModelScope,lifecycleScope的相关问题前言(MVVM演变路程) 以前有说过MVC,MVP,MVVM之间的区别,这里就不再说了。 MVC架构
2021-11-28 21:58:46 1359
原创 JAVA—TCP,UDP
个人博客:haichenyi.com。感谢关注1. 目录1–目录2–概念3–优缺点4–三次握手5–四次握手6–通信流程2. 概念 首先,需要确定的就是他们是socket通信的两种协议。 TCP:一种面向连接,全双工可靠信道的传输层协议 UDP:一种无连接的,不可靠的传输层协议3. 优缺点类型安全有序速度对象个数开销方式TCP安全有序慢1:1大面向字节流UDP不安全无序快1:1,1:N,N:N,N:1小面向报
2021-08-09 22:28:12 253
原创 Java并发——公平锁,非公平锁,悲观锁,乐观锁,死锁
个人博客:haichenyi.com。感谢关注前言 这几个锁都可以从前面一篇线程同步器AQS里面找到影子,我先把前面一篇的加锁流程图拿过来用一用。 上面这个流程图是上一篇最开始讲的时候的一张流程图,后面写的时候,后面的流程图都没有画。这一片我们来画一下后面的流程图。公平锁,非公平锁 前面一篇讲的时候,我说过了,我们当时做的是一个公平锁。这个公平锁和非公平锁的主要区别就是在这个队列。 我们前文讲过了,线程1拿到了锁,线程2,3,4就全部放进队列中等待,那么,流程图如下: 如上图,我
2021-07-27 22:06:58 961 2
原创 JAVA并发——线程同步器AQS
个人博客:haichenyi.com。感谢关注前言 每一项技术的提出都是为了解决某一个问题,带着问题来理解技术,使得印象你对这个技术的理解印象更加深刻。并发 举个栗子:现在有一个需求,网络请求分两批(A,B两个批次),A批次并行请求,B批次串行请求按顺序一个一个请求,有一个总超时时间,B批次每一次请求都有一个超时时间,A批次并发请求先请求,在规定时间内没有返回,再开始请求B批次,谁先返回用谁的。 这个是我们项目里面简化过后的一个逻辑,实际逻辑,比这个还要复杂。怎么实现这个功能呢? 带着这
2021-07-19 22:38:09 386
原创 Android模拟点击
个人博客:haichenyi.com。感谢关注 本篇介绍实现模拟点击的两种方式:performClick();MotionEvent事件 举个栗子:我们现在需要实现点击A按钮,触发B按钮点击事件的效果:两个按钮在布局里面随便创建就好了。 第一种方式就是:调用performClick事件 Button btn1 = findViewById(R.id.btn1); final Button btn2 = findViewById(R.id.btn2);
2021-07-07 21:23:56 1251 2
原创 SpringBoot系列—消息(RabbitMQ)(二十)
个人博客:haichenyi.com。感谢关注 大多数应用当中,可通过消息服务中间件来提升系统的异步通信和扩展解耦能力。简介消息服务中两个重要的概念 消息代理和目的地:当消息发送者发送消息之后,将由消息代理接管,消息代理保证消息发送到指定的目的地。消息发送的两种方式:队列(Queue):点对点消息通信(point-to-point)主题(Topic):发布(publish)/订...
2019-11-27 14:43:37 264
原创 SpringBoot系列—Docker(十九)
个人博客:haichenyi.com。感谢关注简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。 我们spring ...
2019-11-13 14:43:59 183
原创 SpringBoot系列—Run启动原理(十八)
个人博客:haichenyi.com。感谢关注 需要搞清楚几个重要的事件回调机制配置在META-INF/spring.factoriesApplicationContextInitializerSpringApplicationRunListener只需要放在ioc容器中ApplicationRunnerCommandLineRunner 新建一个空项目,就勾选...
2019-11-11 17:27:20 339
原创 SpringBoot系列—Redis(十七)
个人博客:haichenyi.com。感谢关注 前面一篇说到了spring boot自带的缓存SimpleCache,我们也聊到了他的底层实际上就是HashMap,并且这个缓存是放在内存当中的,这样弊端也是有的,比如:内存大小,当服务器关闭之后,缓存就没了等等。简介 实际开发中,一般使用缓存中间件:Redis,EHCache,MemCache等等,今天,我们就来聊聊,经常听到的——Red...
2019-11-06 16:39:47 207
原创 SpringBoot系列—缓存及其源码分析(十六)
个人博客:haichenyi.com。感谢关注 缓存是每个项目都用到的为了提高接口响应效率,降低数据库的查询压力,从而提高系统性能。所以,缓存对于一个项目来说是至关重要的。简介 spring 3+之后,就定义了CacheManager和Cache接口来统一不同的缓存技术。CacheManager:缓存管理器,用于管理各种Cache缓存组件Cahce:定义了各种操作,Spring在C...
2019-11-05 10:51:42 293
原创 SpringBoot系列—邮件(十五)
个人博客:haichenyi.com。感谢关注 邮件发送是必不可少的,不管是注册邮件,还是广告。 spring boot中已经集成的mail的启动器,所以,我们只用配置好就行了。 引入启动器: <dependency> <groupId>org.springframework.boot</groupId> &l...
2019-10-31 17:09:32 267
原创 SpringBoot系列—异步任务与定时任务(十四)
个人博客:haichenyi.com。感谢关注异步任务 什么时候用异步,就是耗时操作的时候就可以用到异步,比如:批量处理数据,批量发邮件等等。 用法与前面的事务管理类似,spring 3+之后,就已经内置了 @Async 来处理异步任务。我们使用两个注解即可。@EnableAysnc 启动类上开启基于注解的异步任务@Aysnc 标识的方法会异步执行如:@EnableAsync...
2019-10-31 14:31:13 221
原创 SpringBoot系列—事务管理(十三)
个人博客:haichenyi.com。感谢关注 我们操作数据库,事务管理是必不可少的一部分。什么是事务 我们在开发企业应用时,用户的一个操作对应数据库可能是多步操作相结合完成的。在这个多个步骤中,其中的一步,可能出现异常,导致后面的步骤无法向下进行,那么,用户的这个操作,可能就没有进行完,前面已经进行的步骤数据就需要回退。举个总所周知的栗子: 银行的转账,A给B转账,转1000块钱...
2019-09-17 13:36:34 175
原创 SpringBoot系列—Spring Data JPA(十二)
个人博客:haichenyi.com。感谢关注什么是 Spring Data Spring Data 是 Spring Boot 底层默认进行数据访问的技术 , 为了简化构建基于 Spring 框架应用的数据访问技术,包括非关系数据库、Map-Reduce 框架、云数据服务等;另外也包含对关系数据库的访问支持。 Spring Data 包含多个模块:Spring Data Comm...
2019-09-11 17:02:16 202
原创 SpringBoot系列—MyBatis(十一)
个人博客:haichenyi.com。感谢关注 上一篇,Druid是用于处理数据库连接池与后台监控。 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordina...
2019-09-07 18:55:33 137
原创 SpringBoot系列—Druid(十)
个人博客:haichenyi.com。感谢关注 一个企业项目中最重要的部分那就是数据库了,对数据库的连接,读写是重中之重。在SpringBoot中数据库怎么连接呢?数据库的连接 这里以MySql为例,还不会用MySql数据库的童鞋,可以看我之前的博客,数据库相关。 第一步, 我们首先在pom.xml中添加jdbc相关的启动器。 <!--jdbc启动器-->...
2019-09-05 16:03:58 6405 1
原创 SpringBoot系列—自定义拦截器(九)
个人博客:haichenyi.com。感谢关注 拦截器拦截请求做额外的处理。举个栗子:登录拦截器,拦截所有的请求,必须登录之后才能访问。package com.haichenyi.springbootbill.interceptors;import org.springframework.web.servlet.HandlerInterceptor;import javax.ser...
2019-09-03 09:23:16 168
原创 SpringBoot系列—国际化(八)
个人博客:haichenyi.com。感谢关注 所谓的国际化就是语言切换。中文切换到其他语种。 国际化的信息,这些都是需要开发人员在配置类中配置好的。SpringBoot会自动加载这些配置类。举个栗子:以登录界面为例,我们的登录界面输入账号、密码框的左边,会有这两个提示,我们就自动修改这两个提示。创建配置文件 首先,你要在你的resources目录下面新建i18n目录,当然,不是必...
2019-09-02 16:13:15 118
原创 SpringBoot系列—热部署与SpringMVC扩展功能(七)
个人博客:haichenyi.com。感谢关注热部署 默认情况下,在开发中我们修改一个项目文件后,想看到效果不得不重启应用,这会导致浪费大量时间,我们希望不重启应用的情况下,程序可以自动部署(热部署)。 第一步:禁用缓存#开发环境下关闭thymeleaf模板缓存,thymeleaf默认是开启状态。记得发布的时候要打开spring.thymeleaf.cache=false 第二...
2019-08-30 10:42:33 180
原创 SpringBoot系列—Thymeleaf常用属性(六)
个人博客:haichenyi.com。感谢关注引用公共片段 th:fragment,th:replace,th:insert 很多页面有很多相同的内容,比方说header和foot,这样的内容就需要公共片段引用了,修改一个地方就全部都改了。类似于android里面提取公共方法一样的道理。方式如下图:<!DOCTYPE html><html lang="en" xm...
2019-08-29 11:07:04 668
原创 SpringBoot系列—Thymeleaf(五)
个人博客:haichenyi.com。感谢关注 SpringBoot官方不推荐使用JSP,因为内嵌Tomcat,Jetty容器不支持以jar的方式运行JSP。SpringBoot中提供了大量模板引擎,包含Freemarker,Mastache,Thymeleaf等。而SpringBoot官方推荐使用Thymeleaf作为模板引擎,因为Thymeleaf提供了完美的SpringMVC的支持。添...
2019-08-27 11:22:50 131
原创 SpringBoot系列—全局配置(四)
个人博客:haichenyi.com。感谢关注 用IDEA可以直接创建SpringBoot项目,创建Moudle的时候,在选Maven的地方,选择Sping Initializr即可,很简单。前面讲过了IDEA生成Maven项目,并且嵌入SpringBoot,直接创建Spring Boot项目就是IDEA直接帮我们依赖,并且生成Application和properties文件。其它,也没啥大的...
2019-08-23 10:25:25 895
原创 SpringBoot系列—@SpringBootApplication源码解析(三)
个人博客:haichenyi.com。感谢关注 上一篇,内容很少,说了一下SpringBoot的底层是怎么依赖的。这一篇讲一下SpringBoot底层源码是怎么实现的。 从SpringBoot的入口开始。第一篇的时候说过了,最好把入口文件放在最外层的包下面,至于原因就不多阐述了。 说说这个 @SpringBootApplication注解的原理,点进去看一下:如下图:主要就是这三...
2019-08-22 16:19:51 189
原创 SpringBoot系列—底层依赖(二)
个人博客:haichenyi.com。感谢关注 前面,我们创建了一个Spring Boot的hello world,我们仅仅添加了一个spring-boot-starter-parent,它是怎么帮我们实现这个依赖的呢?我们可以点进去看一下Ctrl+鼠标左键,如下图: 我们发现它,还有一个父级依赖spring-boot-dependencies,我们继续点进去看,如下图: 在这个...
2019-08-22 14:56:16 234
原创 SpringBoot系列—Hello World(一)
个人博客:haichenyi.com。感谢关注 终于要正式开始了java后台之路,虽然,之前断断续续的看过过黑马的java web视频,但是,都是好几年前的视频,很老了,感觉用处比较大的就是MySQL数据库操作,之前也写过几篇关于MySQL数据库操作的博客。目前,java后台最火的框架就属Spring Boot了。它是spring家族的衍生框架,并不是加强某个功能,它是为了简化配置,提高开发效...
2019-08-22 13:57:32 170
原创 dagger2整个流程解析(一)
个人博客:haichenyi.com。感谢关注 众所周知,dagger的入门是比较难的,在嵌入之前,我先说一下这个dagger必要的东西,也是比较常见的东西,几个注解 @Component,@Singleton,@Module,@Provides,@Inject 大致的整个流程如下:编译的时候,先找构造方法由@Inject标记的类,生成对应的Factory.class类,这个类里面通过...
2019-07-31 20:16:56 154
原创 一场由dagger2引发的一些思考
个人博客:haichenyi.com。感谢关注 用了好几年的dagger2,从dagger2.android。就只有当时刚开始用dagger的时候深入的了解过,后来就再也没有深入的时候研究过。这几天又研究了一下,做个总结。 就拿之前写的kotlin的框架来说,它用的是dagger2.android。从dagger2.android。最明显的就是,需要我们自己写的东西越来越少了,框架帮我们做...
2019-07-31 17:39:06 323
原创 Tomcat安装与启动
个人博客:haichenyi.com。感谢关注 搭建android框架的时候总是会遇到测试网络请求没有接口的问题,今天就自己搭建一个服务器Tomcat。不用写web项目就能直接获取到数据 一.Tomcat主页跳转下载 二.Download——版本(点击)——Binary Distributions——Core——zip(点击),该版本是解压版,解压就可以用,无需安装。如下图 三...
2019-07-25 20:21:34 148
原创 Android开发中的小技巧(持续更新...)
个人博客:haichenyi.com。感谢关注1. 不需要读写权限就可以操作的目录 一谈起要做文件的读写操作,应在脑海中的就是先申请读写权限,没有读写权限就不让对应的操作。那为什么SP也是把数据存本地,缺不需要读写权限呢? 只要是存储在你的APP目录下面,就不需要读写权限。而,手机上面APP目录有两种:一种是手机内部,一种是SD卡目录。怎么获取呢?//手机内部:APP目录下默认有两个文...
2019-07-25 17:55:44 335
原创 kotlin项目框架
个人博客:haichenyi.com。感谢关注MVP+dagger2.android+LiveData+RxJava2+Retrofit2+OkHttpgithub项目链接
2019-07-23 17:31:37 245
原创 kotlin之协程一简单使用
个人博客:haichenyi.com。感谢关注 kotlin协程用于线程切换,kotlin里面不需要new Thread,并且,协程的开销小于new Thread。有三种写法:runBlocking,launch,async既然协程的出现可以取代Thread,我们这里想要验证的是:会不会阻塞主线程?协程里面的代码是怎么执行的?按顺序执行还是并行?协程里面能不能更新页面?依赖 ...
2019-07-18 14:39:32 528
原创 kotlin之内部类,匿名内部类与伴生对象
个人博客:haichenyi.com。感谢关注内部类 kotlin的内部类与java的内部类有点不同***java的内部类可以直接访问外部类的成员,kotlin的内部类不能直接访问外部类的成员,必须用inner标记之后才能访问外部类的成员***class AAA{ var a = 0 class BBB{ //此时,BBB类的内部是不能直接用a变量的 ...
2019-06-14 14:18:48 1601
原创 kotlin之扩展方法
个人博客:haichenyi.com。感谢关注 kotlin的扩展方法类似于java工具类,但是又优于java的工具类。扩展方法 扩展方法的写法,新建一个File类型的kt文件,不是Class类型,不是Interface类型,不是枚举类型,不是Object类型,就是File类型 然后直接定义方法,跟kotlin定义方法相同,需要什么方法就定义什么方法,唯一的区别就是在方法名的前面可以...
2019-06-13 17:51:42 541
原创 kotlin之构造函数(constructor)
个人博客:haichenyi.com。感谢关注 java中的构造函数是与类名相同即可,kotlin里面的构造函数是用constructor关键字表示。 kotlin里面的构造函数分为主构造函数和次构造函数。主构造函数只能有一个,次构造函数个数不限制,可以有一个或者多个constructor 啥是主构造方法?啥是次构造方法呢?//主构造方法如下,跟在类名后面class Person...
2019-06-12 15:53:06 6171 1
原创 kotlin之扩展函数let,run,also,apply
个人博客:haichenyi.com。感谢关注举个例子open class Person { var name: String = "" var age: Int = 0 var address: String = "" override fun toString(): String { return "Person($name)" }...
2019-06-11 15:11:52 392
原创 kotlin之基础
个人博客:haichenyi.com。感谢关注 自从18年上一家公司用kotlin做了项目之后,新公司就没有用过kotlin了,都快要忘完了,最近又想起来了,再捡了一下吧。定义变量的方式 java:类型+变量名+值+逗号int a = 5; kotlin:var/val+变量名+(:类型)+值(ps:类型可省略) var:可变变量(可以重新分配值) val:只读变量(初始...
2019-06-11 13:40:37 323
BufferTextInputLayout的简单用法
2017-03-28
基于SystemBarTint、BottomNavigationBar实现的一个简单的项目框架
2017-03-18
MyApplication.rar
2019-05-24
MVP+Dagger.Android+LiveData+RxJava2.0+Retrofit2.0+OkHttp
2018-12-10
Dagger.Android+LiveData搭的简单的项目框架
2018-12-04
MyProject8
2018-03-01
CoordinatorLayout的常见用法4种
2017-09-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人