- 博客(202)
- 收藏
- 关注
原创 Rxjava:实现原理浅析
onNext的实现如上,若没有disposed(关闭连接),就执行onNext。(此处在create内只是定义好方法,并没有真正执行,只有subscribe触发subscribeActual,该方法里面调用了。这里就发现subscribe会调用内部的subscribeActual,就会再调用被观察者实现的subscribe方法,其中的onNext等内容就会被调用。Observer本身就是一个接口,里面四个方法响应被观察者的不同事件。,传入的相当于事件发出的source。就是真正执行这些定义好的方法)
2022-09-03 02:28:25
750
1
原创 Rxjava:基础入门
Rxjava基于事件流、实现异步操作。采用Observer接口实现Log . d("main" , "开始采用subscribe连接");Log . d("main" , "对Error事件作出响应");} };
2022-08-29 20:36:17
715
原创 动态库、静态库浅析
①命名以*.o结尾②静态库在链接阶段直接加入可执行文件,执行过程无需该静态库③静态库生成的文件链接产生的可执行文件 相对于动态库 较大①命名以*.so结尾②目标文件在链接阶段只指明链接的动态库,动态库与目标文件互相独立,执行过程需要该动态库③动态库生成的目标文件较小对于工程共通源码文件(如多个进程使用同一模块源码),将其制作为动态库可节省系统空间。当动态库出现bug,只需要重新生成一个动态库替换即可。动态库在整个内存空间有一份,而每个进程都有各自的虚拟空间,虚拟空间会通过匿名映射(mmap)使其进程
2022-07-30 16:51:25
622
原创 硬链接、软连接浅析
文件别名通过源文件inode创建新的文件名(不是新文件,就是两个不同文件名指向相同inode),该inode的多个别名都可指向同一个数据。①inode区文件在系统中的唯一标识(访问文件时需要找到该文件的inode,其中存储了文件许多参数)类似快捷方式软连接文件(包含不同inode)指向源文件,再通过源文件找到真实数据inode。④硬链接文件与源文件的inode相同,软连接不同(⑥删除源文件软链接无效,硬链接还可以访问文件内容。③文件和目录皆可创建软链接,可以跨分区系统。可以查看inode号)...
2022-07-30 16:33:40
301
原创 安卓跨进程通信:Messenger、AIDL远程Service 使用
①intent设置隐式必须声明package为service所在包名(而action不必声明,但若声明则必须和服务端设置的action相同,否则service绑定失败)a、客户端与服务端通过service绑定成功后,调用ServiceConnection回调方法,客户端依据返回的binder生成给服务端发送信息的messenger。在Service中创建Messenger实例,通过Message消息机制进行操作,Service的onBind中返回messenger实例的Binder对象。...
2022-07-18 17:18:09
466
原创 安卓异步通信:Handler源码分析
Handler:sendMessage/post:将消息发送到消息队列中dispatchMessage:将消息分发给对应HandlerhandleMessage:依据消息进行相关处理/操作MessageQueue:enqueueMessage:将消息依据时间放入消息队列(入队)next:从消息队列取出消息(出队)Looper:prepare:创建一个循环器+消息队列实例loop:消息循环(即从消息队列取出消息并发给Handler)依旧采用由使用步骤深入分析实际调用:创建Handler对象的过
2022-07-12 17:03:44
259
原创 安卓跨进程通信:Binder解析
从机制、模型角度分析:Binder是一种安卓中实现跨进程通信(IPC)的方式(即Binder机制模型)作用:在安卓中实现跨进程通信从模型的结构、组成来说:Binder是一种虚拟的物理设备驱动(即Binder驱动)作用:连接Service进程、Client进程和ServiceManager进程从安卓代码实现角度来说:Binder是一个类,实现了IBinder接口(即Binder类)作用:将Binder机制模型以代码的形式具体体现在安卓中一个进程空间分为用户空间、内核空间用户空间:进程间,用户空间
2022-07-11 16:05:53
716
原创 安卓异步通信:Handler基础使用及其工作原理
安卓信息传递机制/异步通信机制作用 在多线程应用场景,将工作线程中需要更新UI的操作信息传递到UI主线程从而实现信息异步通信。特点 为保证线程安全,使用Handler主线程 应用程序第一次启动同时开启的主线程;负责处理UI相关事件子线程 后续人为手动开启的线程;负责进行耗时操作消息 线程间通信的数据单元;负责存储通信信息消息队列 队列数据结构;存储Handler发来的消息处理者 主线程与子线程的通信媒介,线程消息的主要处理者;负责添加消息到消息队列、处理循环器分派过来的消息循环器 消息队列与处理
2022-07-11 16:05:04
553
原创 安卓基础知识:Intent解析
用于描述应用的动作及其对应数据①指定当前组件需要做的动作②在不同组件之间传递数据(Activity、Service、BroadcastReceiver)显式意图在intent初始化时直接显式传入所需数据隐式意图通过action、category、data匹配隐式获取到AndroidManifest中设置好的内容具体使用在Activity分析中用到putExtra()、Bundle①8大基本数据类型②Intent、Bundle③Serializable对象、Parcelable对象、CharSe
2022-07-06 11:41:15
683
原创 安卓基础知识:Context解析
Activity本身继承了Context抽象类,可以通过Context获取一些相关信息获取应用相关信息获取系统/应用资源四大组件交互文件相关数据库相关不同类型ActivityContext:与UI相关,对UI资源进行操作ApplicationContext:生命周期较长(ApplicaitonContext生命周期与应用保持一致,注意内存泄漏)Activity继承ContextThemeWrapper来间接继承ContextWrapper,而Service与Applicaiton直接继承Co
2022-07-06 11:20:19
247
原创 安卓四大组件:ContentProvider
跨进程通信,进程间进行数据交互/共享底层采用Binder机制作为数据操作的中间者(搬运工)系统预置URI自定义URI自定义URI格式:content(主题): //com.lms.xiyou(授权信息)/word(表名)/1(记录)主题:URI前缀授权信息:ContentProvider唯一标识符表名:指向数据库某个表的名称记录:表中某个记录例如:指向com.lms.xiyou的ContentProvider中表名为User中id为1的数据表示匹配provider的所有内容(可以使用通配符
2022-07-04 17:17:52
362
原创 安卓四大组件:Service
提供后台长期运行的服务(复杂计算、音乐播放、下载等)本地服务LocalService:运行在主线程,主线程结束,服务也结束因为运行在主线程,通信方便远程服务RemoteService:运行在独立进程,服务常驻后台,不受Activity影响前台服务:在通知栏显示通知(用户可看到)服务时,需要用户知道并进行相关操作(服务终止时,通知栏通知也会消失)后台服务:后台(用户无法看到)类似天气、时间更新等,无需用户知道或操作的任务不可通信的后台服务:用startService()启动,调用者退出后ser
2022-07-03 17:23:57
695
原创 安卓四大组件:BroadCastReceiver
采用观察者模式:基于消息的发布/订阅事件模型分为三个角色:①消息订阅者(广播接收者)②消息发布者(广播发布者)③消息中心基本流程: ①广播接收者 在 消息中心 进行注册②广播发布者 先向 消息中心 发送广播③消息中心 依据 广播发布者 要求筛选 接收者④消息中心 将广播发送到合适 接收者 的消息队列中⑤广播接收者 通过消息循环拿到广播,调用onReceive要求: ①继承BroadcastReceiver基类②必须复写抽象方法onReceive()注:onReceive中不应执行耗时操作(广播
2022-07-03 16:11:28
492
原创 安卓四大组件:Activity
onCreate Activity开始创建onStart Activity正在被启动(上述两步进行初始化工作)onResume ①第一次启动完毕②失去焦点重新返回Activity时(数据恢复+展示)onPause 失去焦点、Activity停止时(数据存储、动画停止、注销广播)onStop Activity彻底被挡住(回收、资源释放)onRestart 在stop后重新完全显示(数据恢复)onDestory Activity被销毁(回收、资源释放)每次启动Activity都会新创建一个Activ
2022-07-03 11:41:06
498
原创 Android开源库:FileDownloader使用流程
全局初始化在Applicaiton的onCreate中进行初始化,调用对应FileDownloader.setupOnApplicationOnCreate(application)(需要自定义属性)或FileDownloader.setup(Context)即可。获取下载实例后,传入下载所用url路径,下载到的本地路径path,设置好下载监听器(下载完成、错误时的反馈),直接start启动即可。①定义监听器和上述单任务相同,需要创建好监听器②创建下载任务队列创建时需要传入创建好的监听器③创建任务路
2022-06-25 17:26:15
2074
原创 Retrofit2基础使用与解析:从使用步骤深入分析源码
联网权限:步骤二 创建接收数据实体类依据服务器返回的数据,建造实体类承载数据使用注解进行请求方式、参数的设置。方法的返回值默认使用Call。(使用RxJava时用Observable)步骤五 创建网络请求接口实例调用retrofit.create方法获取请求接口的实体类,调用该实体类方法即可对请求进行封装。使用生成的call,分别调用enqueue、execute进行异步、同步请求。使用数据response进行数据处理。可以看出实例是使用建造者模式创建的,由用户...
2022-06-15 17:05:55
628
原创 安卓Room学习:数据库版本管理、数据迁移
在原先的数据库实体类之上添加一个元素,此时不进行其他更改直接运行将会报错。那么就需要更改两个位置:数据库版本号version数据迁移策略表示抹去数据库所有内容,使用新的数据库(全空)手动创建迁移策略有添加行但是没有删除行的对应函数,所以删除行操作麻烦一些。参数表示版本迁移变化,使用SQL语句进行数据迁移...
2022-06-11 10:43:28
376
原创 安卓Room学习:基础使用优化,LiveData监听、线程切换等;结构整理
先前每次进行数据更改都要手动调用刷新界面的方法,而学习过的LiveData可以自动检测数据,在变化时进行相应处理。(返回LiveData的方法系统自动放在副线程自动执行)用LiveData检测数据库的所有words,当变化时自动更新界面。数据库连接的初始化是很耗时的操作,而先前代码每次连接都将创建一个实例,是很浪费资源的,那么将其获取方式改为单例模式将大大优化性能。上述即将生成包装为单例模式,每次用getInstance获取实例。使用:线程操作数据库操作不应在主线程进行,之前为了简便实现暂时在主线
2022-06-10 11:07:28
1378
原创 安卓Room学习:实体Entity、操作Dao、DataBase基础使用
创造对应数据库的实体类,用Entity修饰类,设置主键,可以自定义列名。配置当前连接数据库所用的信息,依据实体类创建数据库注意使用抽象实现测试上述操作最终获取数据库操作对象Dao后续操作直接用Dao调用方法即可完成对数据库的操作。...
2022-06-06 17:21:45
617
原创 Linux基本学习:磁盘、进程管理
df -h:按M、G单位显示大小显示当前目录下文件占用空间情况du -h:按M、G单位显示大小du -a:额外显示隐藏文件unmount:卸载在Linux中每一个进程都有一个id号ps -a:显示当前终端进程ps -u:以用户的信息显示进程ps -x:现实进程运行的参数ps -aux:显示所有进程grep 条件:查找符合条件的内容ps -aux|grep 条件:|为管道符,A|B可以将A的结果用于B的查询对象(二次查询)ps -ef:可查看父进程pstree -p:显示父idpstree -u
2022-06-06 16:35:02
151
原创 Linux基本学习:账号、用户组管理
useradd -m 用户名:自动创建该用户主目录(在home下同步创建目录)userdel -r 用户名:将用户目录同时删除usermod 修改内容 修改用户root用户可以设置任何用户密码:①passwd 用户名②输入密码(不显示)普通用户更改自己密码:①passwd②输入当前用户密码再输入新密码passwd -l 用户名:用户不可登陆passwd -u 用户名:解锁用户超级用户切换到普通用户:su 用户名用exit可以退出返回到root用户......
2022-06-05 17:21:30
112
原创 Linux基本学习:Vim编辑器
vim 文件名:进入文件(新、已有)命令模式:按i进入编辑模式:正常输入文本或代码按:进入底线命令模式:输入底线命令按/+内容:可查找指定内容按u撤销操作编辑模式操作与普通输入正常esc退出编辑模式,回到命令模式底线命令模式w:保存文件q:退出编辑器q!:强制退出不保存w 文件名:另存为set nu:显示行号...
2022-06-05 16:45:08
63
原创 Linux基本学习:文件内容查看及文件操作
空格翻页,换行为一行一行看,q退出,/+查找内容:可以在当前内容中向下进行查找,?+查找内容:向上查询,n/N分别向上、下定位到查找内容/+查找内容:可以在当前内容中向下进行查找,?+查找内容:向上查询,n/N分别向上、下定位到查找内容head -n 10 文件名:看前10行内容tail -n 10 文件名:看前10行内容......
2022-06-05 16:16:52
179
原创 Linux基本学习:文件属性解析及其更改
用ls -l查看属性开头由一串英文字母组成:第一个字母:d目录,-文件,l链接文档(类似快捷方式),b外接接口,c鼠标键盘后续九个字母三三一组:r可读,w可写,x可操作,-无权限第一组:属主权限root第二组:属组权限(管理组、游客组)第三组:其他用户权限第二列为包含的文件数第三列是属主属于哪个主人,属于谁第四列是属组属于哪个用户组第五列为文件大小后面为时间若文件为l链接文件,最后还会显示该文件的指向是哪里chgrp -R 属组名 文件名:递归更改chown -R 属主名 文件
2022-06-05 16:02:56
132
原创 Linux基本学习:关机命令、基本目录介绍及操作
关机前将数据从内存同步到硬盘:关机:延时关机:重启: 或 进入系统后使用查看文件文件介绍:bin:Binary缩写,保存着常用命令boot:Linux核心文件dev:保存外部设备mnt:临时用来挂在别的文件etc:存放所有配置文件(redis等)home:每个用户的主目录lib:存放系统基本的动态链接库lost+found:非法关机时,存放文件media:linux自动识别设备后存放于此opt:主机额外安装软件所放的目录proc:虚拟目录,是系统内存映射root:超级用户
2022-06-05 15:47:47
391
原创 Spring整合MyBatis、声明式事务
导入依赖给Mapper接口添加实现类就是将sqlSession的使用流程编写出来,但用SqlSessionTemplate替代,这个template就是一个模板,用来替换作用。编写Spring配置,实现各类注入数据源配置即设置数据库连接所需数据,替代了mybatis的配置文件目的肯定是仿mybatis获取最后的mapper对象,那么逐层向上需要SqlSession,再上需要SqlSessionFactory该方式就是基于原本mybatis操作,将sqlsession生成操作交给springIOC
2022-06-03 11:38:23
166
原创 Spring AOP简析与使用
AOP简析AOP面向切面编程即基于代理实现的对方法进行拦截的过程。常用名词Aspect切面:实际就是真正拦截调用的方法PointCut切点:所需拦截的位置、方法,即拦截点Target对象:需要被拦截、代理的对象AOP使用导入依赖 <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</arti
2022-05-29 16:58:42
106
原创 Spring注解开发
文件配置:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:sc
2022-05-26 16:33:39
71
原创 Spring Bean自动装配:xml配置、注解配置
自动装配Spring会在上下文自动寻找并且给bean注入装配属性ByName <bean id="cat" class="com.lms.pojo.Cat"/> <bean id="dog" class="com.lms.pojo.Dog"/> <bean id="person" class="com.lms.pojo.Person" autowire="byName"> <property name="name" val
2022-05-26 15:43:46
188
原创 基础算法:发牌算法、快慢指针判断循环
发牌算法当情况需要等概率的随机分配数据,可以尝试发牌算法(时间复杂度O(n)) for (int i = 0; i < res.length; i++) { swap(res, i, i + random.nextInt(n - i)); }思想很简答,就是从头到尾进行遍历,将当前位置与其后随机位置值进行替换,便利完成后就得到相对公平的数据随机分配。判断循环循环可以用Set集合的不可重复或递归推值进行判断,但可能由于数据过大导致递归栈溢出或集合过大
2022-05-26 15:23:04
202
原创 Spring依赖注入DI、Bean作用域
构造器注入Set方式注入依赖:Bean对象的创建依赖于容器注入:Bean对象中的所有属性由容器注入基础数据类型注入:直接value赋值即可<property name="name" value="yi"/>实体类数据bean注入:用ref指向已生成的bean <bean id="student" class="com.lms.pojo.Student"> <property name="address" ref="address"/>
2022-05-18 16:50:18
86
原创 基础算法:位运算相关题目
数字范围按位与给定初始数字到结尾数字,求其所有数字按位与的结果。public int rangeBitwiseAnd(int left, int right) { int head = 1 << 30; int res = 0; while (head > 0 && ((left&head) == (right&head))) { res |= left&head;
2022-05-18 15:58:36
92
原创 数据库 MYSQL结构与Server组件分析
基础架构Server层+存储引擎层Server层组件连接器用于身份验证和权限限制。用户登录时,连接器验证账户秘密、权限的内容,账号密码通过后,在权限表内查询用户权限,之后该连接的所有操作会依据此时获取的用户权限进行限制。查询缓存执行查询时,MYSQL会先在查询缓存里判断该查询是否执行过(缓存内以K-V存储),若查询过,直接将缓存结果发给客户端。分析器工作分两步:1.词法分析:提取语句中的关键词2.语法分析:判断SQL语句是否符合语法优化器优化器将操作按其认为最优执行方案去执行如多个
2022-05-18 10:55:02
256
原创 数据库基础语句
检索SELECT检索一列:SELECT name FROM user;检索name这一列的所有值检索多列:SELECT name,age FROM user;检索name、age多列全部值检索所有列:SELECT * FROM user;检索所有列的所有值用distinct检索不同列:SELECT distinct name FROM user;检索表中所有不同的名字限制检索结果的数目:SELECT name FROM user limit 5;检索前5个name排
2022-05-18 10:38:59
204
原创 HTTP常见首部信息解析
HTTP报文HTTP报文结构如上,由首部、主题组成,并且由空行分割在HTTP中,请求和相应报文的首部格式不同,上方为请求报文首部,下方为响应报文首部HTTP报文首部分为4类:通用首部字段、请求首部字段、响应首部字段、实体首部字段通用首部字段**Cache-Control:**控制缓存行为,如可被缓存区缓存、不能缓存、缓存相关设置等**Connection:**管理连接**Date:**创建报文的时间**Pragma:**报文指令,包含特定指令**Trailer:**报文末端的首部,说
2022-05-18 10:07:48
615
原创 网络层TCP/UDP首部格式,传输层IP数据报格式
整体在网络中传输的IP数据报信息分为:IP首部和传输数据首部首部内容如上,接下来一一解释:版本: 将显示使用的IPv4或IPv6版本,分别对应4、6两个值**首部长度:**因其占4位,所以最大值为15,表示n个32位字长度(即4字节),因为固定部分就有20字节,所以此位最少应该是5(20字节)。因为数值以4字节为单位,若可变部分中可选字段不足4字节的整数倍,将会被填充部分填够。**区分服务:**用于获取更好服务,通常不用**总长度:**包括首部长度和数据部分长度(即整个IP数据报长度)生存
2022-05-17 16:41:14
727
原创 Spring简介、IOC介绍、基础使用、配置说明
简介Spring是一个开源免费框架。是一个轻量级的、非入侵式的框架。控制反转IOC和面相切面编程AOP。支持事务处理,对框架整合的支持。组成Spring CoreSpring AOPSpring DAOSpring ORMSpring WebSpring ContextSpring Web MVCIOC理论推导原本开发:UserDao接口public interface UserDao { void getUser();}->UserDaoImpl实现类
2022-05-15 16:41:12
136
原创 MyBatis缓存
简介在数据库查询操作中,多次查询相同数据的情况是可以通过将数据先保存起来,后续查询直接从内存取的方式进行优化,缓存就是这样。缓存通常用于查询次数较多且变化较少的数据。Mybatis缓存默认定义两级缓存:一级缓存sqlSession级别,本地缓存二级缓存namespace(mapper接口)级别:需要手动开启,可以通过cache接口自定义二级缓存一级缓存sqlSession级别缓存,即在一次sqlSession中,查询相同内容,只会执行一次sql查询,将结果放到内存,后续所有查询结果都将指向第
2022-05-15 11:57:37
208
原创 MyBatis动态SQL
动态SQL依据不同条件生成不同SQL语句IF语句 <select id="queryBlogIf" parameterType="map" resultType="Blog"> select * from blog where 1=1 <if test="title != null"> and title = #{title} </if> <if test="auth
2022-05-15 10:35:02
72
原创 MyBatis复杂查询环境,多对一、一对多处理
复杂环境搭建①创建SQL表CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO teacher(`id`, `name`) VALUEs (1, 'qin');CREATE TABLE `student` ( `id` IN
2022-05-14 10:51:08
174
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人