- 博客(25)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 使用Kotlin+JetPack 从零开发自己的日记App
前言本人Android小菜鸡一枚,开发该app的主要目的是为了巩固kotlin语法,学习使用JetPack进行一个完整App的开发,不得不说,Kotlin+JetPack开发起来真是无敌丝滑(末尾附上项目地址)介绍????时刻是一个使用纯kotlin和Jetpack实现的具有简单增删改查功能的日记App效果图使用的相关技术DataBinding :省去了繁琐的findViewById工作,而且通过和ViewMode配合,可以直接把ViewModel的数据渲染到界面上Paging:分页加载库
2021-09-11 22:22:46
1103
3
原创 view绘制流程学习总结
学习笔记启动Activity时,在ActivityThread#HandleResumeActivity把DecoreView添加进window然后用ViewRootImpl#setView将DecoreView和viewRootImpl建立关联,在setView中调用requestLayout开始进行View绘制流程具体调用 requestLayout ->scheduleTraversals(设置标记,拦截多余的刷新事件-> 建立同步屏障,为界面刷新做准备,将view绘制的事件包
2021-11-29 21:37:43
1575
1
原创 自定义PhotoView实现手机相册图片展示效果(双击放大缩小,左右滑动切换,上下滑动关闭,双指缩放)
介绍最近在学习事件分发的知识点,刚好做这个Demo也是为了巩固知识点参照了手机系统相册的浏览交互交过,主要包含几个方面单击隐藏状态栏,和标题栏双击放大缩小图片图片放大状态时左右滑动图片左右滑动切换图片下滑缩小关闭图片,改变背景透明度效果展示话不多说,先来看实现效果单击隐藏状态栏标题栏双击放大缩小图片图片放大状态时左右滑动图片左右滑动切换图片下滑缩小关闭图片,改变背景透明度实现过程源码地址...
2021-11-27 23:00:12
1361
1
原创 AndroidView事件体系,事件分发机制
前记最近重新看了开发艺术的事件分发章节,在这里记录下新的学习体会问题记录一个warning: onTouch lambda should call View#performClick when a click is detected.意思说我设置了touchListener的同时还需要调用performClick方法,为什么系统硬要我调用这方法,下面我们从源码去分析这个问题前置知识MotionEvent手指接触屏幕会产生一系列事件,而这些事件就是以MotionEvent为载体进行传递的,它
2021-11-27 21:10:44
794
原创 jetpack之viewModel理解
引言最近重新学习了Jetpacl相关组件,在这里记录下先提出几个问题ViewModel是什么?它有什么作用屏幕旋转或者配置变更时,如何进行Activity数据保存ViewModel是如何做到数据保存的ViewModel介绍ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化,比如横竖屏切换的时候viewModel的简单使用加入依赖implementation
2021-11-23 22:16:36
299
原创 lifecycle原理分析
lifecycle核心类ComponentActivity:Activity的爷爷类,在AndroidX的版本下已经实现了LifecycleOwner接口,默认实现的被观察者,持有了lifecycle对象ReportFragment:无UI的fragment,获取到activity的周期状态,然后进行分发LifecycleRegistry:lifecycle的具体实现类,通过addObserver方法添加观察者流程分析componetActivity的oncreate方法,在这里通过inje
2021-11-22 23:15:11
1511
原创 livedata原理分析 (解除livedata粘性事件)
先思考几个问题livedata是怎么做的监听生命周期的 ?postValue和setValue有什么区别 ?事件是如何发送和接收的?livedata粘性事件是什么 ?livedata的粘性事件是怎样引起的 ?首先需要知道注册监听和发送事件的几个方法 observe,postvalue,setvalue,我们主要是对这几个方法进行分析发送事件livedata发送事件的方法有两种 postValue和setValue我们先来看setValue直接调用到了MutableLiveData的
2021-11-22 16:28:44
1823
原创 flutter界面组件
接触flutter有快半年了,这期间跟着做了一个flutter项目,作为一个新手,最开始接触的是大量的界面,在这里记录下界面上的一些套用方法和模板,把代码贴进来,以后就能直接copy了(_)flutter界面模板1.Appbar沉浸式AppBar这里了留了四个参数,包括一个title和leading2PreferredSizeWidget transparentAppBar({ @required BuildContext context, Widget title, Widget
2020-12-07 23:43:44
304
原创 java基础进阶—范型
1.泛型的好处 适用于多种数据类型执行相同的代码 泛型中的类型在使用时指定,不需要强制类型转换 2.泛型类和泛型接口泛型方法3.通配符类型4.虚拟机是如何实现泛型的?Java语言中的泛型只在程序源码中存在,在编译后的字节码文件中,就已经替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此,对于运行期的Java语言来说,ArrayList<int>与Ar...
2020-12-07 11:14:23
208
1
原创 RxJava线程切换与自定义操作符3
RxJava和RxAndroid,在Android中使用RxJava必须得加上RxAndroid,RxAndroid相当于是一个扩展代码爆黄需要我们写一个disposable,在页面销毁的时候同时释放资源,防止内存泄漏create 和 just操作符just相当于是简化版的create,已经给我们封装好了onNext和onComplete方法,而使用create操作符便于我们自定义化SubscribeOn按照上一节的流程,从订阅开始,往上走,直到subscr...
2020-12-06 21:54:30
178
1
原创 RxJava模式与原理2
标准的观察者设计模式抽象被观察者和抽象观察者,一个具体的被观察者和多个具体观察者,被观察者中有一个容器,包含了所有的观察者,当被观察发生变化,可以遍历自己的容器发送通知给所有观察者Rxjava模式为不标准的观察者设计模式,一个起点被观察者,一个终点观察者,中间的卡片对上一级来说是观察者,对下一级来说是被观察者RxJava Hook 钩子 简单理解就是在其他调用之前先执行自己的方法,就像一个钩子,先给它钩出来执行完再放回去所有的操作符在调用之前都会 先调用RxJavaPlugi..
2020-12-06 21:54:20
156
1
原创 RxJava 使用及思想1
Rx 思维:响应式编程生活中的例子:起点(分发事件(PATH):我饿了)----------下楼-------去餐厅--------点餐----------> 终点(吃饭 消费事件)程序中的例子:起点(分发事件:点击登录)----------登录API-------请求服务器--------获取响应码----------> 终点(更新UI登录成功 消费事件)Rx思维,从一个点(生产事件,需要处理的事件,对象)开始,中间可以使用各种操作符不断对这个点进行处理操作,进行完所.
2020-12-06 21:54:06
151
1
原创 Java8集合源码分析
java位运算符 与 & 非 ~ 或 | 异或 ^位运算符主要针对两个二进制数的位进行逻辑运算 如果 4&7 那么这个应该怎么运算呢? 首先我们需要把两个十进制的数转换成二进制 4 : 0000 0100 7 : 0000 0111每一位进行与操作,得出结果再转化为十进制移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数。 Syste...
2020-12-06 08:25:03
161
1
原创 java并发编程详细
基础概念线程生命周期sleep,join,yield,打印程序中所有的线程Thread和Runable的区别 Thread 才是 Java 里对线程的唯一抽象,Runnable 只是对任务(业务逻辑)的抽象。Thread 可以接受任意一个 Runnable 的实例并执行。暂停、恢复和停止操作对应在线程 Thread 的 API 就是 suspend()、resume()和 stop()。但是这些 API 是过期的,也就是不建议...
2020-12-05 15:18:22
112
1
原创 ViewPager缓存 ,预加载,懒加载
缓存和预加载的区别先有缓存再预加载,缓存的目的是为了预加载setOffscreenPageLimit 设置预加载的item数量setOffscreenPageLimit (1) 就是左边缓存一个,右边缓存一个,加上自己本身,一共缓存三个,而只会预加载同方向上的一个setOffscreenPageLimit (0) 无效,必须要预加载至少一个使用懒加载,先看看ViewPager的源码通过adapter适配器把不同的item类型变成ViewPager...
2020-12-05 15:15:10
707
原创 事件分发,事件冲突原因与解决方案
事件分发的流程三个函数 dispatchTouchEvent 事件分发,事件处理 onInterceptTouchEvent 事件拦截 onTouchEvent 事件消费 1.从当前的Activity开始,开始分发事件2.调用它的window,即PhoneWindow进行事件分发,phoneWindow再分发给mDecor 就是一个FrameLayout3.因为fram...
2020-12-05 15:14:20
496
原创 Handler源码解析2
享元设计模式内存复用,使用同一块内存空间,bitmap,recycleView都有使用这种思想在loop从消息队列中取出消息并分发完后,并不会把消息对象销毁,而是通过msg.recycleUnchecked()方法清空消息放入消息池进行回收这样做可以避免反复创建和销毁msg对象,造成内存抖动和oom创建消息的时候使用obtain方法从内存中取,不用反复申请内存空间同步屏障可以屏蔽同步消息,来优先执行系统中重要的异步消息命中if后,进入循环过滤掉同步消息,而ms..
2020-12-05 15:03:06
2415
5
原创 阻塞队列和线程池原理
阻塞队列 实现了BlockingQueue接口阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。阻塞队列优点:充当一个容器来解决生产者和消费者的强耦合问题,平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度生产者和消费者彼此之间不直接通信,而是通过阻塞队列来进行通信,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从..
2020-12-05 09:22:36
586
原创 JVM内存管理深度剖析
Java Virtural Machine一个翻译工具,我们写的程序通过编译后生成字节码文件,字节码文件再通过JVM翻译产生机器语言不同平台上可以对应不同的JVM版本,可以运行在不同的操作系统上翻译 .class .jar等Java内存管理机制,运行数据区运行时数据区是分配给JVM的内存资源,由JVM自由管理线程私有(程序计数器,虚拟机栈,本地方法栈)线程共享 (方法区,堆)程序计数器指向当前线程正在执行的字节码指令的地址,记录...
2020-12-05 09:16:21
116
原创 Kotlin高阶函数和协程
高阶函数高阶使用源码中的高阶函数T.()和(T)的区别调用myLet是把T当作参数传入,it就是传入的这个T,myLet2中,T.()相当于把this传了过去,在this的环境中可以直接使用length方法,而myLet中必须通过it来调用高阶的一些使用例子lamda用来定义线程需要执行的方法,其他参数用来控制执行,赋上了默认值自由控制的轮询器,counts控制次数,mm是需要执行的方法KT范...
2020-12-05 09:06:34
279
原创 Android虚拟机与ClassLoader类加载
Dalvik/ART 虚拟机DVM(Dalvik virtual machine) 也是实现了JVM规范的一个虚拟器,默认使用CMS垃圾回收器,但是与JVM运行 Class 字节码不同,DVM执行 Dex(Dalvik Executable Format)** ——专为 Dalvik 设计的一种压缩格式。Dex 文件是很多 .class 文件处理压缩后的产物,最终可以在 Android 运行时环境执行。而ART(Android Runtime) 是在 Android 4.4 中引入的一个开发..
2020-12-05 09:03:27
170
原创 深入理解对象与垃圾回收机制
虚拟机中对象的创建过程虚拟机遇到一条new指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。分配内存内存划分虚拟机将为新生对象分配内存。为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来分配内存的两种方式 指针碰撞: Java堆中内存是绝对规整的,每次为新对象分配内存只需要把指针向空闲挪动一段与对象大小相等的距离 空闲列表: Java堆中的内存不规整,已使用的内存和空闲的内存相互交错,为了合理分配内存,虚拟机必须...
2020-12-05 09:01:40
194
原创 Handler源码解析1
Handler:发送和接收消息Looper:用于轮询消息队列,一个线程只能有一个LooperMessage: 消息实体MessageQueue: 消息队列用于存储消息和管理消息handler机制就是一个传送带的运转机制。1)MessageQueue就像履带。2)Thread就像背后的动力,就是我们通信都是基于线程而来的。3)传送带的滚动需要一个开关给电机通电,那么就相当于我们的loop函数,而这个loop里面的for循环就会带着不断的滚动,去轮询messag...
2020-12-05 08:57:39
156
1
原创 第一行代码——数据存储全方案
数据存储文件存储1.写入数据到文件中使用Context类中的openFileOutput()方法,该方法需要传入两个参数,第一个是文件名,指定数据要存入哪一个文件夹,第二个参数为文件的操作模式openFileOutput()方法返回一个FileOutputStream对象,然后以Java流的方式写入到文件即可。 public void save(String inputext){ FileOutputStream outputStream=null; Buffer
2020-06-09 20:43:31
265
原创 【Android dark模式 初体验】
【Android dark模式 初体验】在 2019 年的 Google I/O 和 Apple WWDC 上,新露面的 Android 10 和 iOS 13 都宣布将支持 Dark Theme 也就是我们常说的暗黑模式,并提供相关 API 供开发者适配。为什么我们需要深色模式?可大幅减少耗电量(具体取决于设备的屏幕技术)。为弱视以及对强光敏感的用户提高可视性。让所有人都可以在光线较...
2020-04-29 18:26:22
402
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人