自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(187)
  • 收藏
  • 关注

原创 Android全新UI框架之Compose状态管理与重组

Compose采取了声明式UI的开发范式。在这种范式中,UI的职责仅作为数据状态的反应。如果数据状态没有变化,则UI永远不会自行改变。如果把Composable的执行看作是一个函数运算,那么状态就是函数的参数,生成的布局就是函数的输出。

2024-02-24 16:14:35 1383 2

原创 Android全新UI框架之Compose组件渲染流程

在传统View体系中,组件渲染分为三步:测量、布局和绘制。Compose也遵循这样的分层设计,将组件渲染流程划分为组合、布局与绘制三个阶段。对于一般的组件都是正常经历组合->布局->绘制三个阶段来生成帧画面的,当然也存在特例,LazyColumn、LazyRow、等组件的子项合成可以延迟到这类组件的布局阶段进行,这是由于这类组件的子项组合需要依赖这类组件在布局阶段所能提供的一些信息。

2024-02-23 11:05:58 1204

原创 Android全新UI框架之常用ComposeUI组件

在Compose中,每个组件都是一个带有@Composable注解的函数,被称为Composable。Compose已经预置了很多基于MD设计规范的Composable组件。在布局方面,Compose提供了Column、Row、Box三种布局组件(感觉跟flutter差不多),类似于传统视图开发中的LinearLayout(Vertical)、LinearLayout(Horizontal)、RelateiveLayout,可以满足各类产品的常见布局需求。

2024-02-21 18:49:55 1724

原创 Android全新UI框架之Jetpack Compose入门基础

以往,我们开发Android原生页面的时候,通常是在xml中画相关的UI控件,然后在activity中通过findViewById拿到相关的控件对象,接着根据业务需求调用该控件对象的相关API方法。在传统视图体系中由View与ViewGroup构成视图树,而Compose中也有同样一颗视图树,它由LayoutNode构成,由Composition负责管理。由于Compose在编程范式上与传统视图体系有着根本的不同,在开始深入学习Compose之前,有必要对Compose API的设计原则做一个介绍。

2024-02-20 18:04:45 1181

原创 前端性能优化之渲染优化

为了使每一帧页面渲染的开销都能在期望的时间范围内完成。就需要开发者了解渲染过程的每个阶段,以及各阶段中有哪些优化空间是我们力所能及的。经过分析根据开发者对优化渲染过程的控制力度,可以大体将其划分为5各部分:js处理、计算样式、页面布局、绘制与合成。这个过程中的每一个阶段都有可能产生卡顿。注意:并非对于每一帧画面都会经历这5个部分,比如仅修改与绘制相关的属性(文字颜色,背景图片或边缘阴影等),而未对页面布局产生任何修改,那么在计算样式阶段完成后,便会跳过页面布局直接执行绘制。

2024-01-10 22:22:33 1079

原创 前端性能优化之数据存取,存储以及缓存技术

无论是哪种计算机语言,说到底它们都是对数据的存取与处理。若能在处理数据前,更快地读取数据,那么必然会对程序执行性能产生积极的作用。一般而言,js的数据存取有4种方式。其中数组元素和对象属性不仅可以是直接字面量的形式,还可以是由其他数组对象或对象属性组成的更为复杂的数据结构。从读取速度来看,直接字面量与变量是非常快的,相比之下数组元素和对象属性由于需要索引,其读取速度也会因组成结构的复杂度越高而变得越慢。如今浏览器对内部js引擎不断迭代优化,在一般的数据规模下,其快慢的差别已经微乎其微。

2024-01-10 06:38:33 1369

原创 前端性能优化之图像优化

图像优化问题主要可以分为两方面:图像的选取和使用,图像的加载和显示。

2024-01-07 22:46:00 1031

原创 前端页面的生命周期

传输层常见的协议有tcp协议和udp协议,由于我们重点是前端页面的资源请求,这需要面向连接,丢包重发以及✓数据传输的各种控制,所以我们详细介绍下“三次握手”和“四次挥手”。“三次握手”具体过程分为如下步骤:客户端生成一个随机数seq,假设其值为t,兵将标志位SYN设为1,将这些数据打包后发给服务端后,客户端进入等待服务端确认的状态。

2024-01-05 21:55:39 1051

原创 前端性能优化简述

大部分网站体现的价值都无外乎信息的载体、交互的工具或商品流通的渠道,这就要求它们需要与更多的用户建立关系,同时还要保持所建立的联系拥有绵延不绝的用户粘性,所以网站就不能只关注自我表达,而不顾及用户是否喜欢。用户的留存我们都希望用户访问网站所进行的交互,对网站构建的内容来说是有意义的,比如,电商网站希望用户浏览并购买商品,社交网站希望用户之间进行互动,视频网站希望用户观看视频,而这些希望都是建立在网站用户留存的基础上的。。

2024-01-04 18:45:52 352

原创 Vue.js 3.0的变化

keep-alive组件如果使用KeppAlive缓存组件,无论如何加载组件,都会触发。

2023-12-04 07:39:23 225

原创 Android系统新特性——功耗的改进

移动设备的续航时间无疑是所有用户都非常在意的。我们都希望自己的手机一次充电可以使用更长的时间。但遗憾的是,近几年移动设备的电池元件一直没有重大的技术突破。并且,随着硬件性能的提升却带来了更多的电量消耗。如果对比近几年的Android和ios手机,我们会发现:通常情况下,Android手机的电池要比同时期的ios电池容量大很多,但是待机方面却没有太大的优势。ios之所以续航优秀,其很大的原因在于对于后台进程的限制。在ios上,后台进程是无法长时间处于活跃状态的。

2023-11-26 18:06:10 292

原创 android系统新特性——用户界面以及系统界面改进

一类是系统的内置应用,这些应用提供了手机的基本功能。包括launcher、系统设置、电话、相机等。它们位于/packages/apps/目录下。理论上,这些应用都是可以被第三方应用所替代的,例如:我们完全可以安装一个第三方的电话、相机,而不使用系统的,这也是Android系统最为灵活的地方(注意:系统设置通常无法被第三方应用替代,因为它使用了一些拥有非常高权限的内部api。为了保证系统安装,这些api很多不会对外开放)。

2023-11-26 00:03:31 525

原创 AndroidNDK开发之交叉编译

在Android studio2.2以及以上,构建原生库的默认工具是。CMake是一个跨平台的构建工具,可以使用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。cmake并不直接构建出最终的软件,而是产生其他工具的脚本(如makefile)。然后再根据这个工具的构建方式使用。cmake是一个比make更高级的编译配置工具,可以根据不同的平台、不同的编译器生成相对应的makefile或vcproject项目,从而达到跨平台的目的。

2023-11-23 18:22:37 585

原创 Linux常用命令指南以及shell脚本编程

shell脚本里面的sh和bash有什么区别:linux中sh是链接到bash上的,所以sh与bash在功能上是没有去别的,相当于bash解析器是sh的增强版本。创建sh文件编写sh脚本文件——使用vim 命令进行编写bin / bash#我是注释执行sh文件输出结果:hello world执行sh文件时传入参数bin/bash#我是注释echo 当前shell脚本的名称:$0echo 参数1: $1echo 参数2: $2echo 本次执行结果状态如下:if (($?));

2023-11-23 17:57:41 91

原创 Vue入门——核心知识点

Vue是一套用于构建用户界面的渐进式JS框架。构建用户界面:就是将后端返回来的数据以不同的形式(例如:列表、按钮等)显示在界面上。渐进式:就是可以按需加载各种库。简单的应用只需要一个核心库即可,复杂的应用可以按照需求引入各种Vue插件。在 Vue 中,除了内置指令 (v-model, v-show, v-else 等) 外,也可以自定义指令。自定义指令的语法和使用方式如下:1.全局自定义指令// 这里写你的代码,比如操作 DOM},

2023-11-01 23:46:17 206

原创 iOS的应用生命周期以及应用界面

我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示:AppDelegate是应用程序委托对象,它继承了UIResponder类,并实现了UIApplicationDelegate委托协议。

2023-10-28 00:31:22 931

原创 kubernetes集群yaml文件与kubectl工具

k8s集群中对资源管理和资源对象编排部署都可以通过声明样式(yaml)文件来解决,也就是可以把需要对资源对象操作编辑到yaml格式文件中,我们把文件叫做资源清单文件,通过kubectl命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。

2023-09-15 13:50:38 118

原创 Flutter与Native通信原理剖析与实践

这三种类型的Channel都是全双工通信,即AB,Flutter可以主动发送消息给Native端,并且Native接收到消息后可以做出回应,同样,Native端可以主动发送消息给Flutter端,Flutter端接收到数据后返回给Native。在讲解Flutter与Native之间是如何传递数据之前,我们先了解下Flutter与Native的通信机制,Flutter和Native的通信是通过Channel来完成的。我们分几种场景来介绍Flutter和Native之间的通信。

2023-09-14 04:41:34 827

原创 Flutter框架和原理剖析

Flutter是Google推出并开源的跨平台开发框架,。开发者可以通过Dart语言开发Flutter应用,一套代码同时运行在ios和Android平台。不仅如此,flutter还支持web、桌面、嵌入应用的开发。flutter提供了丰富的组件、接口,开发者可以很快地为flutter添加native扩展。。

2023-09-13 14:04:06 564

原创 Dockerfile解析

Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务;

2023-09-12 06:59:29 510

原创 什么是Docker和Docker-Compose?

compose是docker公司推出的一个工具软件,可以管理多个Docker容器组成一个应用。Docker Server:Docker daemon的主要组成部分,接受用户通过Docker Client发出的请求,并按照相应的路由规则实现路由分发。而且,如果使用了GoLand编译器安装了Docker插件之后编写docker-compose的时候都会有提示的。Docker镜像:Docker镜像运行之后变成容器(docker run)Docker Client:Docker的客户端。Docker自身组件。

2023-09-11 16:01:11 1140

原创 c++中的常用知识点总结

当一个派生类通过多条路径继承自同一个基类时,如果不使用虚基类,那么在派生类中就会存在多个基类子对象的实例,这样就会导致同名成员在派生类中出现冗余,访问这些成员时会产生二义性。友元类(Friend Class)是指在一个类中声明另一个类为友元,从而使得被声明的类可以访问声明它为友元的类的私有成员。总结来说,虚基类的作用是解决多继承中的菱形继承问题,避免冗余和二义性,确保派生类对基类成员的访问是唯一的。在上面的例子中,类B被声明为类A的友元类,因此类B可以访问类A的私有成员privateData。

2023-09-05 17:34:35 941 1

原创 Android开发中的各种零碎知识点

这种方式主要是获取和监听系统深色主题模式的开启状态动态设置主题或皮肤。首先我们需要定义好深色主题或者皮肤,换肤功能通过来实现。onCreate方法中在setContentView之前判断是否开启暗黑模式,设置暗主题。

2023-09-04 11:44:30 161

原创 深入理解Android消息机制的原理

message.target=null,这类消息不会被真的执行,它起到了flag标记的作用,mq在遍历消息队列时,如果队头是同步屏障消息,那么会忽略同步消息,优先让异步消息得到执行。这就是它的目的,一般异步消息和同步消息会一同使用。消息分发核心方法在于loop方法,loop方法里面会的调用的linux里的epoll机制。epoll会把哪个流发生了怎样的I/O事件通知我们。此时我们对这些流的操作都是有意义的。为什么主线程中创建Handler没有绑定looper,也能发送消息呢?异步消息&同步屏障 使用场景。

2023-08-28 00:12:08 157

原创 从源码到原理剖析activity核心知识点

因为这个时候view的绘制流程还没有开始。要拿到View的宽高,那么View的绘制流程(measure—layout—draw)至少要完成measure阶段。总所周知:Android的sdk并没有提供相关的api。那么,我们如何设计一个管理任务栈的工具类呢?为什么无法在onCreate或onResume方法中获取到View的宽高?如何获取栈顶的activity以及监听activity前后台切换。子线程中真的不能更新UI吗?

2023-08-27 18:03:23 99

原创 Android中的APK打包与安全

如果使用传统的aapt2的方式打包,在多模块的情况下将会十分的麻烦。幸好,gradle已经将上述的命令集成了在了各个task中。AndroidManifest.xml:工程中AndroidManifest.xml编译后得到的二进制xml文件。resources.arsc:包含了所有资源文件的映射,可以理解为资源索引,通过该文件能找到对应的资源文件信息。res:res目录下资源文件编译后得到的二进制xml文件。按照上面的顺序使用各个命令便可以打包生成一个apk包了。

2023-08-25 15:57:22 1560

原创 Android 热修复核心原理

dexopt在Dalvik中虚拟机在加载一个dex文件时,对 dex 文件 进行 验证 和 优化的操作,其对 dex 文件的优化结果变成了 odex(Optimized dex) 文件,这个文件和 dex 文件很像,只是使用了一些优化操作码。dex2oatART 预先编译机制,在安装时对 dex 文件执行dexopt优化之后再将odex进行 AOT 提前编译操作,编译为OAT(实际上是ELF文件)可执行文件(机器码)。(相比做过ODEX优化,未做过优化的DEX转换成OAT要花费更长的时间)..

2023-08-25 11:33:36 309

原创 深入理解android线程池实现原理

【代码】深入理解android线程池实现原理。

2023-08-24 14:59:39 84

原创 Android多线程开发核心知识点

线程安全的本质是能够让并发线程,有序的运行(这个有序可能是先来后到的排队,有可能有人插队,但是不管怎么着,同一时刻只能一个线程有权访问同步资源),线程执行的结果,能够对其他线程可见。

2023-08-24 11:07:12 96

原创 重新认识Android中的线程

【代码】重新认识Android中的线程。

2023-08-24 06:39:34 669

原创 Gin框架入门

Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,具有快速灵活,容错方便等特点对于golang而言,web框架的依赖要远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

2023-08-23 11:47:11 126

原创 Go语言里面的各种疑难杂症

而传递切片时,只是将切片的引用(指针)传递给函数,因此不会复制整个切片的内容,函数内部对切片进行的修改会反映到原始切片中。需要注意的是,defer延迟执行的函数调用参数在defer语句出现时就会求值,而不是在函数返回时才求值。长度固定 vs. 长度可变:数组的长度是固定的,定义时需要指定长度,并且无法修改。数据存储方式:数组的元素在内存中是连续存储的,而切片则是一个对数组的引用,并包含了指向底层数组的指针、长度和容量等信息。如果不定参数传入了0个值,那么在方法内部,不定参数的长度为0,即切片的长度为0。

2023-08-22 05:49:34 382

原创 Go基本入门知识

Go语言的特点Golang执行流程分析编译与运行说明Go程序开发的注意事项Go源文件以"go"为扩展名Go应用程序的执行入口是main函数Go语言严格区分大小写Go方法由一条条语句构成,每个语句后不需要分号Go编译器是一行行进行编译的,因此我们一行就写一条语句,不能把多条语句写在同一个,否则报错Go语言定义的变量或者import的包如果没有使用到,代码不能编译通过

2023-08-11 11:09:27 43

原创 Golang函数以及函数和方法的区别

我们可以给他一些我们想要的方法来满足我们的实际工程中的需求,就像上面一样我重定义了int并给了它一个乘2和平方的方法,这里我们要注意一个细节,接收者是指针和非指针的区别,我们可以看到当接收者为指针式,我们可以通过方法改变该接收者的属性,但是非指针类型缺做不到。这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变类的成员变量。

2023-08-11 10:32:01 611

原创 Dart基础语法2

同Android Handler类似,在Dart运行环境中也是靠事件驱动的,通过event loop不停的从队列中获取消息或者事件来驱动整个应用的运行,isolate发过来的消息就是通过loop处理。首先Loop检查微服务队列,依次执行Event,当微服务队列执行完后,就检查Event queue队列依次执行,在执行Event queue的过程中,每执行完一个Event就再检查一次微服务队列。构造函数时,Dart 会在编译时期创建一个不可变的对象,这意味着相同的构造参数只会创建一个实例。

2023-07-22 00:12:19 84

原创 Dart基础语法1

​ 学习一门新的语言,我们可以以自己现有的熟悉的语言来类比,比如我们非常熟悉Java,那么剩下的就是需要掌握与Java不同的Dart语法,剩下的就需要靠自己多写多看来慢慢熟悉。​ 国际惯例,使用Dart完成一个:“Hello,World!运行Dart 代码可以使用,dart命令需要配置环境变量,将 “${FLUTTER_SDK}/bin/cache/dart-sdk/bin” 配置到变量 PATH 中即可。

2023-07-19 23:48:17 56

原创 JNI技术之语言变声实现

今天,我们利用jni来实现一个变声效果,在QQ等许多社交软件上想必我们都有看过各种变声功能。想要实现这个功能需要借助fmod库。下面,我们通过一个案例来讲解如何对接具有jni相关功能的第三方库。将库文件导入jniLibs文件夹下面‘

2023-04-18 11:05:44 257 1

原创 JNI接着入门

主要简述了如何搭建jni环境以及一些基础的jni语法,这篇博客我们使用几个案例接着来夯实基础。好了,以上几个案例供大家参考使用。

2023-04-15 11:15:21 101

原创 JNI入门基础

java的很多功能实际上的驱动都是通过c/c++开发的,通过JNI,Java可以调用c/c++实现的驱动,从而扩展jvm的能力。如果是一个全新的工程,我们在新建工程时,选择c++工程,然后无脑下一步即可,这样Android Studio就会给你生成一个c++工程的模板代码,我们后续要添加一些c/c++代码都可以仿照这个模板。extern “C” // 表示下面的代码,采用C的编译方式 如果是新建了一个.c文件,则需要删掉否则编译会报错,如果是新建了一个c++文件,则需要添加。

2023-04-10 23:39:58 681

原创 Android动画进阶

初始化PathMeasure有两种初始化方式:初始化pathMeasure后,可以通过调用PathMeasure.setPath()函数来将Path和PathMeasure进行绑定。这样就已经初始化完成了,可以调用pathMeasure来返回路径的相关信息。也可以通过PathMeasure的另一个构造函数直接完成初始化。

2023-04-04 11:21:49 565

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除