
android
文章平均质量分 92
爱海贼的小码农
做任何事,不要急躁,要慢慢沉淀自己。
展开
-
记录一个温度曲线的View
最近做项目需求的看到需要自定义一个温度曲线的图。由于之前的同事理解需求的时候没有很好的理解产品的需求,将温度的折线图分成了两个View,温度高的在一个原创 2022-07-13 20:04:49 · 353 阅读 · 1 评论 -
一位苦逼程序员的找工作经历
最近一个多月因为找工作的原因,一个多月没有更新技术博客了。这一篇博客也不是讲技术文章,而是我找工作的一个多月的一些想法还有一些关于Android开发的思考。 首先说一下我的个人的背景,我是本科2020年7月毕业的,截止目前为止工作了两年。我是在2017年的时候,也就是我大二的时候接触了java语言,大概是2018年的时候接触了android,然后并开始自己学习并且入门的android。在2018年的时候,由于个人思考的东西比较幼稚,而且那时候确实android看起来形式也很好,加上自己也比较喜欢做ap原创 2022-06-25 19:03:40 · 2669 阅读 · 6 评论 -
Android消息机制分析
Android消息机制分析Android的消息机制主要是指Handler的运行机制以及Handler所附带的MessageQueue和Looper的工作过程。这三者实际上是一个整体,只不过 我们在开发过程中比较多地接触到Handler而已。Handler的主要作用是将一个任务切换到某个指定的线程中去执行,那么Android为什么要提供这个功能呢? 或者说Android为什么需要提供在某个具体的线程中执行任务这种功能呢?这是因为Android规定访问UI只能在主线程中进行,如果在子线程中访问UI,那么程序就原创 2022-04-25 18:01:16 · 631 阅读 · 1 评论 -
MeasureSpec源码解读
今天来讲讲MeasureSpec吧。因为他与View的测量流程相关性很大,只有正确的理解了MeasureSpec的工作原理,我们才能更好的自定义View。那么MeasureSpec它的作用是什么呢?一般来说,它在很大程度上决定了一个View的尺寸规格。为什么是很大程度上呢?因为一个View的尺寸大小还可能和布局树中的父布局相关。想一想,如果你在你的子View中的布局参数写了match_parent,那么这个控件的大小是不是就和父布局相关了?所以说,我们今天的内容主要有以下两个方面,一个是MeasureSpe原创 2022-04-22 14:53:39 · 1972 阅读 · 1 评论 -
深入解析View的绘制源码流程
View的绘制流程今天来讲讲View的绘制流程吧,这一块也是我比较薄弱的地方,而且之前没有什么耐心去看这一块。今天就来学习这一块的知识点。主要分为3部分:View树的创建ViewRootImpl的创建真正的绘制流程开始performTraversalsView树的创建首先思考一个问题View的绘制从那里开始?关于这个问题我一开始也谷歌百度了很多东西,但是还是不能解决我的疑惑。所以今天我打算从根本上解决这个问题——从Activity的setContentView开始看。下面开始我的原创 2022-04-21 16:17:24 · 812 阅读 · 0 评论 -
Viewmodel源码解析
Viewmodel源码解析现在Viewmodel相信大家都比较熟悉了,adnroid的官网上也介绍了它的一些特性。具体的这里就不多讲了。今天就来讲解它的源码,讲解为什么它能够在配置发生变化的时候还能保存数据。现在在Activity和Fragment中怎么去初始化一个viewmodel呢?一般来讲就是通过谷歌给我们提供的扩展函数去初始化,具体如下val plantingsViewModel:PlantListViewModel by viewModels()所以今天,我就从这一个函数开始入手去看看V原创 2022-04-20 18:25:06 · 559 阅读 · 0 评论 -
浅析音视频同步原理
音视频同步今天我们来讲解一下音视频同步吧。讲完这篇,结合之前几篇博客,我们对音视频开发也算有一个入门级别的理解了。首先思考几个问题:1、为什么需要音视频同步?因为视频和音频是两个独立的任务在运行,视频和音频的解码速度也不一样,解码出来的数据也不一定马上就可以显示出来。视频:帧率,表示视频一秒显示的帧数。音频:采样率,表示音频一秒播放的样本的个数。从帧率及采样率,即可知道视频/音频播放速度。声卡和显卡均是以一帧数据来作为播放单位,如果单纯依赖帧率及采样率来进行播放,在理想条件下,应该是同步的原创 2022-04-15 15:10:43 · 391 阅读 · 0 评论 -
MediaCodec解析MP4视频
MediaCodec讲解MediaCodec是Android提供的用于对音视频进行编解码的类,它通过访问底层的codec来实现编解码的功能。是Android media基础框架的一部分,通常和 MediaExtractor, MediaSync, MediaMuxer, MediaCrypto, MediaDrm, Image, Surface和AudioTrack一起使用。MediaCodec支持的数据类型编解码器支持的数据类型:压缩的音视频数据,原始音频数据和原始视频数据。数据通过ByteB原创 2022-04-12 18:11:44 · 5455 阅读 · 0 评论 -
Android屏幕刷新机制
Android屏幕刷新机制一些前置概念屏幕刷新率一秒内屏幕刷新的次数(一秒内显示了多少帧的图像),单位 Hz(赫兹),如常见的 60 Hz,90Hz,120Hz(高刷新率)。刷新频率取决于硬件的固定参数(不会变的)。逐行扫描显示器并不是一次性将画面显示到屏幕上,而是从左到右边,从上到下逐行扫描,顺序显示整屏的一个个像素点,不过这一过程快到人眼无法察觉到变化。以 60 Hz 刷新率的屏幕为例,这一过程即 1000 / 60 ≈ 16ms。帧率 (Frame Rate)表示 GPU 在原创 2022-04-07 13:11:26 · 1400 阅读 · 0 评论 -
BlockCanary源码解析
BlockCanary源码解析在讲解BlockCanary源码之前,我们还是需要将一些前置的知识点。本文不讲Handler的原理了,不太懂的同学自己去百度看一下吧。什么是卡顿在讲解卡顿问题之前,我们需要讲一下帧率这个概念。帧率是以帧称为单位的位图图像连续出现在显示器上的频率。我将一个例子,电影播放。电影其实就是很多张照片(帧)的一个集合,那为什么看起来是一个连续的过程呢?因为电影每一秒出现过的图片不止一张。实际上电影一般一秒出现的图片张数会在20-30张。假设电影一秒出现了24张图片,那么这个电影的帧原创 2022-03-24 17:43:41 · 2378 阅读 · 0 评论 -
LeakCanary源码分析
LeakCanary源码解析内存泄露今天来讲解一下老生常谈的问题了,内存泄露以及讲解LeakCanary是如果检测内存泄露的。大家都在讲内存泄露,那么内存泄露的最根本的原因是什么?**最根本的原因就是该回收的对象没有被即使回收掉,导致了内存泄露。**要理解这句话,就要对java的垃圾回收机制有一定的了解了。什么是垃圾回收呢?就是java虚拟机在运行的时候会触发垃圾回收的机制,将那些没有用的,占用内存的对象回收掉。java虚拟机是怎么判断这个对象有没有用呢?是根据GC ROOT的可达性算法去判断的。就是原创 2022-03-23 18:17:43 · 2796 阅读 · 0 评论 -
Glide的缓存源码分析
Glide的缓存流程上一篇讲解了Glide的整体流程,其实很多时候,只有第一次加载图片的时候,我们才会按照那一个流程去走。因为很多时候,我们都是有缓存了。有了缓存之后,加载流程就会稍微变一下了。那么今天,我们就来讲解一下Glide中的缓存。在讲解Glide缓存之后,我建议大家先去了解一下LinkedHashMap的实现。因为这里涉及到LRU算法。推荐大家一篇关于LinkedHashMap的博客:田小波关于LinkedHashMap的源码分析先来一张Glide缓存的流程图吧,让大家对Glide的流程有一个原创 2022-03-22 14:21:31 · 2364 阅读 · 0 评论 -
Glide源码分析之Glide的整体加载流程
大家应该都听说过Glide图片加载库,或多或少都知道怎么去使用Glide去加载一张图片。Glide对于使用者来说是非常友好的一个库。那么今天我们就来学习Glide的源码,网上也有很有优秀的博客讲解Glide的源码的,现在我们一起来学习Glide的源码。这个优秀的框架是怎么帮助我们实现图片的加载和显示的。很多人看源码都不知道从哪里下手。这篇博客也分享一下我平时是怎么看源码的。这是基于Glide:4.10版本的源码分析 首先我们平时是怎么使用Glide的?Glide.with(context).loa原创 2022-03-15 17:33:13 · 1003 阅读 · 0 评论 -
从源码角度去理解Context
Android中的各种ContextContext家族之间的关系看以上这幅图,我们知道各个Context之间的关系。 首先Context是一个抽象类,它的实现由两个一个是ContextImpl,它是真是实现了Context里面的各种方法。ContextWrapper里面持有一个ContextImpl变量——mBase,调用ContextWrapper的实现方法,最终都是通过mBase去调用ContextImpl的实现方法。这里用的设计模式是装饰模式,ContextWrapper是装饰类。Conte原创 2022-01-19 14:30:30 · 466 阅读 · 0 评论 -
Android面试之Activity的启动流程详解
根Activity的启动过程根Activity的启动整体过程如下:主要分为四部分Launcher请求ATMS创建根ActivityATMS会去请求zygote创建应用程序进程zygote去创建应用程序进程ATMS请求ApplicationThread创建根Activity我们分析的话,不会按照上面的每一个步骤去分析。我们会按照下面三个部分去进行源码(android 10)的分析Launcher请求ATMS的过程ATMS到ApplicationThread的调用过程Activity原创 2022-01-13 18:51:57 · 2408 阅读 · 0 评论 -
Lifecycle与LiveData的珠联璧合
Lifecycle与LiveData的讲解lifecycleLifecycle是生命周期感知型组件,什么是生命感知型组件?就是与Activity或者Fragment绑定之后,可执行一些操作来响应Activity和Fragment的生命周期状态的变化。lifecycle是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并且允许其他对象观察此状态。Lifecycle使用两种主要枚举跟踪其关联组件的生命周期状态:这两个枚举类分别是State和Event。Stat原创 2022-01-07 17:24:57 · 1694 阅读 · 0 评论 -
Kotlin协程,我学“废”了
Kotlin协程 Kotlin协程(本文讲解的协程都是基于Kotlin讲解的,其他语言的协程不在本文章的讨论范围)目前很流行的一款用于异步任务处理的库,都知道它处理异步任务特别好用,但是很少人去探究它背后的原理。还有一点,由于它是用于处理异步任务的,很多人将协程与线程做对比,也有一些人将协程与Rxjava做对比。这篇文章将从最简单的用法开始,层层递进的讲解以下知识点:如何使用使用协程,以及协程中的一些重要概念协程怎么处理异步任务和并发任务挂起函数是什么协程底层是怎么实现挂起-恢复的协程是怎么原创 2022-01-04 11:56:35 · 1807 阅读 · 0 评论 -
JetPack之Hilt的使用
JetPack之Hilt的使用什么是依赖注入 讲解Hilt之前,我们先来理解什么是依赖注入以及依赖注入有什么用。 首先我们来看我们平时自己写代码 class LearnHilt { var firstMember:FirstMember = ... var secondMember:SecondMember = ... } 首先,这一个类有两个成员变量,firstMember和secondMember。这两个变量也叫做这个类的依赖。那么要初始化这两个依赖。原创 2021-12-20 23:12:30 · 728 阅读 · 0 评论 -
Jetpack之Room的使用
Room的使用Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。如何配置...apply plugin: 'kotlin-kapt' ...dependencies { ... kapt "androidx.room:room-compiler:$rootProject.roomVersion" implementation "androidx.原创 2021-12-16 11:45:00 · 2593 阅读 · 0 评论 -
视图绑定(ViewBinding )与数据绑定(Databinding)
视图绑定(ViewBinding )与数据绑定(Databinding)什么是ViewBindingviewbinding是android jetpack的一个特性,通过viewbinding功能,您可以更轻松地编写可与视图交互的代码。在模块中启用viewbinding之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。用法如何配置Viewbinding在每一个模块中的build.gradle中进行如下配置 android原创 2021-09-28 00:30:33 · 4185 阅读 · 3 评论 -
内存泄漏优化
内存泄漏:用动态存储分配函数开辟的空间,在使用完之后没有释放这块内存单元,直到程序结束。说白了就是对象使用完了,没有及时回收这个对象占用的内存空间。内存泄漏的危害如果一直不回收内存,那么可用内存就会越来越少,程序效率就会降低,最后造成内存溢出,然后程序就会崩掉。在android开发中,最容易引发内存泄漏的就是Context,你如Activity的Context,因为它包含大量的引用,一旦泄...原创 2019-09-09 12:57:05 · 193 阅读 · 0 评论 -
HandlerThread与IntentService
HandlerThreadHandlerThread是Android API提供的一个方便、便捷的类,使用它我们可以快速的创建一个带有Looper的线程。Looper可以用来创建Handler实例。它继承Thread,外界需要通过Handler的消息方法来通知HandlerThread执行一个具体任务。使用步骤1.创建HandlerThread线程2.运行线程3.获取HandlerThr...原创 2019-09-08 13:30:11 · 254 阅读 · 0 评论