
Android
文章平均质量分 79
Jinxed.
这个作者很懒,什么都没留下…
展开
-
view绘制流程学习总结
学习笔记启动Activity时,在ActivityThread#HandleResumeActivity把DecoreView添加进window然后用ViewRootImpl#setView将DecoreView和viewRootImpl建立关联,在setView中调用requestLayout开始进行View绘制流程具体调用 requestLayout ->scheduleTraversals(设置标记,拦截多余的刷新事件-> 建立同步屏障,为界面刷新做准备,将view绘制的事件包原创 2021-11-29 21:37:43 · 1625 阅读 · 1 评论 -
自定义PhotoView实现手机相册图片展示效果(双击放大缩小,左右滑动切换,上下滑动关闭,双指缩放)
介绍最近在学习事件分发的知识点,刚好做这个Demo也是为了巩固知识点参照了手机系统相册的浏览交互交过,主要包含几个方面单击隐藏状态栏,和标题栏双击放大缩小图片图片放大状态时左右滑动图片左右滑动切换图片下滑缩小关闭图片,改变背景透明度效果展示话不多说,先来看实现效果单击隐藏状态栏标题栏双击放大缩小图片图片放大状态时左右滑动图片左右滑动切换图片下滑缩小关闭图片,改变背景透明度实现过程源码地址...原创 2021-11-27 23:00:12 · 1617 阅读 · 1 评论 -
AndroidView事件体系,事件分发机制
前记最近重新看了开发艺术的事件分发章节,在这里记录下新的学习体会问题记录一个warning: onTouch lambda should call View#performClick when a click is detected.意思说我设置了touchListener的同时还需要调用performClick方法,为什么系统硬要我调用这方法,下面我们从源码去分析这个问题前置知识MotionEvent手指接触屏幕会产生一系列事件,而这些事件就是以MotionEvent为载体进行传递的,它原创 2021-11-27 21:10:44 · 900 阅读 · 0 评论 -
jetpack之viewModel理解
引言最近重新学习了Jetpacl相关组件,在这里记录下先提出几个问题ViewModel是什么?它有什么作用屏幕旋转或者配置变更时,如何进行Activity数据保存ViewModel是如何做到数据保存的ViewModel介绍ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化,比如横竖屏切换的时候viewModel的简单使用加入依赖implementation原创 2021-11-23 22:16:36 · 335 阅读 · 0 评论 -
lifecycle原理分析
lifecycle核心类ComponentActivity:Activity的爷爷类,在AndroidX的版本下已经实现了LifecycleOwner接口,默认实现的被观察者,持有了lifecycle对象ReportFragment:无UI的fragment,获取到activity的周期状态,然后进行分发LifecycleRegistry:lifecycle的具体实现类,通过addObserver方法添加观察者流程分析componetActivity的oncreate方法,在这里通过inje原创 2021-11-22 23:15:11 · 1613 阅读 · 0 评论 -
livedata原理分析 (解除livedata粘性事件)
先思考几个问题livedata是怎么做的监听生命周期的 ?postValue和setValue有什么区别 ?事件是如何发送和接收的?livedata粘性事件是什么 ?livedata的粘性事件是怎样引起的 ?首先需要知道注册监听和发送事件的几个方法 observe,postvalue,setvalue,我们主要是对这几个方法进行分析发送事件livedata发送事件的方法有两种 postValue和setValue我们先来看setValue直接调用到了MutableLiveData的原创 2021-11-22 16:28:44 · 1959 阅读 · 0 评论 -
使用Kotlin+JetPack 从零开发自己的日记App
前言本人Android小菜鸡一枚,开发该app的主要目的是为了巩固kotlin语法,学习使用JetPack进行一个完整App的开发,不得不说,Kotlin+JetPack开发起来真是无敌丝滑(末尾附上项目地址)介绍????时刻是一个使用纯kotlin和Jetpack实现的具有简单增删改查功能的日记App效果图使用的相关技术DataBinding :省去了繁琐的findViewById工作,而且通过和ViewMode配合,可以直接把ViewModel的数据渲染到界面上Paging:分页加载库原创 2021-09-11 22:22:46 · 1197 阅读 · 3 评论 -
第一行代码——数据存储全方案
数据存储文件存储1.写入数据到文件中使用Context类中的openFileOutput()方法,该方法需要传入两个参数,第一个是文件名,指定数据要存入哪一个文件夹,第二个参数为文件的操作模式openFileOutput()方法返回一个FileOutputStream对象,然后以Java流的方式写入到文件即可。 public void save(String inputext){ FileOutputStream outputStream=null; Buffer原创 2020-06-09 20:43:31 · 295 阅读 · 0 评论 -
ViewPager缓存 ,预加载,懒加载
缓存和预加载的区别先有缓存再预加载,缓存的目的是为了预加载setOffscreenPageLimit 设置预加载的item数量setOffscreenPageLimit (1) 就是左边缓存一个,右边缓存一个,加上自己本身,一共缓存三个,而只会预加载同方向上的一个setOffscreenPageLimit (0) 无效,必须要预加载至少一个使用懒加载,先看看ViewPager的源码通过adapter适配器把不同的item类型变成ViewPager...原创 2020-12-05 15:15:10 · 767 阅读 · 0 评论 -
事件分发,事件冲突原因与解决方案
事件分发的流程三个函数 dispatchTouchEvent 事件分发,事件处理 onInterceptTouchEvent 事件拦截 onTouchEvent 事件消费 1.从当前的Activity开始,开始分发事件2.调用它的window,即PhoneWindow进行事件分发,phoneWindow再分发给mDecor 就是一个FrameLayout3.因为fram...原创 2020-12-05 15:14:20 · 536 阅读 · 0 评论 -
Handler源码解析2
享元设计模式内存复用,使用同一块内存空间,bitmap,recycleView都有使用这种思想在loop从消息队列中取出消息并分发完后,并不会把消息对象销毁,而是通过msg.recycleUnchecked()方法清空消息放入消息池进行回收这样做可以避免反复创建和销毁msg对象,造成内存抖动和oom创建消息的时候使用obtain方法从内存中取,不用反复申请内存空间同步屏障可以屏蔽同步消息,来优先执行系统中重要的异步消息命中if后,进入循环过滤掉同步消息,而ms..原创 2020-12-05 15:03:06 · 2473 阅读 · 5 评论 -
阻塞队列和线程池原理
阻塞队列 实现了BlockingQueue接口阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元素、消费者用来获取元素的容器。阻塞队列优点:充当一个容器来解决生产者和消费者的强耦合问题,平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度生产者和消费者彼此之间不直接通信,而是通过阻塞队列来进行通信,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从..原创 2020-12-05 09:22:36 · 643 阅读 · 0 评论 -
JVM内存管理深度剖析
Java Virtural Machine一个翻译工具,我们写的程序通过编译后生成字节码文件,字节码文件再通过JVM翻译产生机器语言不同平台上可以对应不同的JVM版本,可以运行在不同的操作系统上翻译 .class .jar等Java内存管理机制,运行数据区运行时数据区是分配给JVM的内存资源,由JVM自由管理线程私有(程序计数器,虚拟机栈,本地方法栈)线程共享 (方法区,堆)程序计数器指向当前线程正在执行的字节码指令的地址,记录...原创 2020-12-05 09:16:21 · 141 阅读 · 0 评论 -
Kotlin高阶函数和协程
高阶函数高阶使用源码中的高阶函数T.()和(T)的区别调用myLet是把T当作参数传入,it就是传入的这个T,myLet2中,T.()相当于把this传了过去,在this的环境中可以直接使用length方法,而myLet中必须通过it来调用高阶的一些使用例子lamda用来定义线程需要执行的方法,其他参数用来控制执行,赋上了默认值自由控制的轮询器,counts控制次数,mm是需要执行的方法KT范...原创 2020-12-05 09:06:34 · 316 阅读 · 0 评论 -
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 · 211 阅读 · 0 评论 -
深入理解对象与垃圾回收机制
虚拟机中对象的创建过程虚拟机遇到一条new指令时,首先检查是否被类加载器加载,如果没有,那必须先执行相应的类加载过程。分配内存内存划分虚拟机将为新生对象分配内存。为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来分配内存的两种方式 指针碰撞: Java堆中内存是绝对规整的,每次为新对象分配内存只需要把指针向空闲挪动一段与对象大小相等的距离 空闲列表: Java堆中的内存不规整,已使用的内存和空闲的内存相互交错,为了合理分配内存,虚拟机必须...原创 2020-12-05 09:01:40 · 227 阅读 · 0 评论 -
Handler源码解析1
Handler:发送和接收消息Looper:用于轮询消息队列,一个线程只能有一个LooperMessage: 消息实体MessageQueue: 消息队列用于存储消息和管理消息handler机制就是一个传送带的运转机制。1)MessageQueue就像履带。2)Thread就像背后的动力,就是我们通信都是基于线程而来的。3)传送带的滚动需要一个开关给电机通电,那么就相当于我们的loop函数,而这个loop里面的for循环就会带着不断的滚动,去轮询messag...原创 2020-12-05 08:57:39 · 181 阅读 · 1 评论