自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

345丶

2020

  • 博客(178)
  • 资源 (1)
  • 收藏
  • 关注

原创 Android | 关于 OOM 的那些事

Android 系统对每个app都会有一个最大的内存限制,如果超出这个限制,就会抛出 OOM,也就是Out Of Memory。本质上是抛出的一个异常,一般是在内存超出限制之后抛出的。

2023-05-25 10:23:06 1226

原创 Android | View.post 到底是在什么时候执行的

相信绝大部分人都使用过view.post这个方法,且使用场景基本上都是用来获取view的一些属性数据,并且我们也都知道,该方法会使用handler发送一个消息,并且该消息被回调执行的时候view 是已经绘制完成的,今天我们来聊一聊它内部的一些细节。通过上面的分析,其实这个逻辑本身还是非常简单的,但是需要你提前了解 View 的添加流程以及绘制流程和Handler ,了解这些你再去看这个源码就会非常简单。

2023-04-27 12:00:16 693

原创 Android | 输入系统(IMS)

一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的,然后从 Window 中进行分发,甚至有些人可能也只知道和这几个方法,对于 View 层的了解都不属性。自从对于应用层面的分发过程了解清楚之后,就一直忍不住想知道只个事件到底是怎么产生的,到底是从哪里来,要往哪里去,具体的派发机制是怎样的。虽然在开发的过程中搞懂应用层面的也就够了,但是在好奇心的驱使下,我还是忍不住的开始了…

2023-01-30 10:50:56 963

原创 Android | Activity 启动流程分析

Activity类是 android 应用的关键组件,在日常开发中,绝对少不了组件。既然用了这么久,你知道他的启动流程🐴?作为一个应用层开发者,大多数人可能觉得学习这些对日常开发可能没有太大帮助。但是多了解一下 framework 的代码还是很有必要的,了解系统组件机制,对于一些问题我们也能快速的定位找到问题的所在点,并且在面试的时候也是一个加分项。本文基于 Android 12 版本源码,从作为切入点,对整个启动流程进行分析。

2022-12-22 17:26:22 879 1

原创 Android | WMS 解析(一)

前段时间分析了 Window 的添加、更新和删除流程,也知晓了 Activity 、Dialog 和 Toast 中 Window 的创建过程,今天就接着上篇文章,看一下 WMS 的创建 以及WindowManager 添加 WIndow 后 WMS 是怎样进行操作的。上篇文章点这里直达;简称 WMS ,是系统的核心服务,主要分为四大部分,风别是窗口管理,窗口动画,输入系统中转站,Surface 管理。

2022-11-02 11:58:21 819

原创 Android | Handler.runWithScissors 解析

在一个线程中通过 Handler 向另外一个线程发送消息,并等待另一个线程处理完成后再继续执行。

2022-10-21 12:45:31 575

原创 Android | 格子拖拽填充效果

自定义一个格子拖拽填充的效果

2022-09-22 17:04:46 424

原创 Android | LiveData 源码分析

LiveData 是一种持有可被观察的数据存储类,和其他可被观察的类不同的是,LiveData 是就要生命周期感知能力的,这意味着他可以在 Activity ,fragment 或者 service 生命周期活跃状态时 更新这些组件。在日常开发过程中,LiveData 已经是必不可少的一环了,例如MVVM以及MVI开发模式中,都用到了 LiveData。......

2022-08-29 18:07:25 1031

原创 算法 | 时间与空间复杂度

算法的效率主要由以下两个复杂度来评估:时间复杂度:评估执行程序所需要的时间。可以估算出程序对处理器的使用程度空间复杂度:评估执行程序所需要的的存储空间。可以估算出程序对计算机内存的使用程度...

2022-07-12 16:11:10 554 1

原创 Android | Compose 生命周期和附带效应

可组合项 `应该没有附带效应`,但是,如果在对应用状态进行转变时需要使用可组合项。此时你应该使用 Effect API , 以便以可以预测的方式来执行这些附带消息

2022-06-08 18:32:20 1606

原创 Android | Compose状态管理

前言应用中的状态指的是可以随时间变化的任何值。这个定义非常广泛,例如从数据库到类的变量,页面上显示的提示信息等。状态和组合由于 Compose 是声明式工具集,因此更新它的唯一方法是通新参数调用同一可组合项。这些参数是界面状态表现形式。每当状态更新时,都会发生重组。可组合项中的状态可组合函数可以使用 remember 可组合项记住单个对象。系统会在初始组合期间将由 remember 计算的值存储在组合中,并在重组的期间返回存储的值。remember 既可以用于存储可变对象,又可用于存储不可变对象。

2022-05-30 11:42:17 1481

原创 Android | Compose 初上手

简介Jetpack Compose 是用于构建原生 Andorid 界面的新工具包,Compose 使用了更少的代码,强大的工具和直观的 Kotlin Api 简化并且加快了 Android 上界面的开发。在 Compose 中,在构建界面的时候,无需在像之前那么构建 XML 布局,只需要调用 Jetpack Compose 函数来声明你想要的的元素,Compose 编译器就会自动帮你完成后面的工作。在开始使用 Compose 之前,你需要重新搭建环境,可参考**官方文档**注解@Compos

2022-05-25 17:21:33 1497

原创 Android | 如何计算图片占用内存的大小

前言对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下并整理了一下。基础知识MDPIHDPIXHDPIXXHDPIXXXHDPIdensity(像素密度)160240320480640分辨率360x640540x960720x12801080x19201440x2560比例11.5234

2022-04-11 23:49:35 4890

原创 Android | 理解 ViewRootImpl

简介ViewRootImpl 是 View 的最高层级,是所有 View 的根。ViewRootImpl 实现了 View 和 WindowManager 之间所需要的协议。ViewRootImpl 的创建过程是从 WindowManagerImpl 中开始的。View 的测量,布局,绘制以及上屏,都是从 ViewRootImpl 中开始的。我们通过一张图来认识一下它:Window我们知道界面中所有的元素都是由 View 构成的,View 是依附于 Window 上面的。Window 只是一个

2022-03-21 15:57:57 6390

原创 Android | 理解Window 和 WindowManager

前言Window 是一个窗口的概念,是所有视图的载体,不管是 Activity,Dialog,还是 Toast,他们的视图都是附加在 Window 上面的。例如在桌面显示一个悬浮窗,就需要用到 Window 来实现。WindowManager 是访问 Window 的入口。Window 是一个抽象类,他的实现类是 PhoneWidow,Activity 中的 DecorView ,Dialog 中的 View 都是在 PhoneWindow 中创建的。因此 Window 实际是 View 的直接管理者,

2022-03-18 11:24:35 3953

原创 Java | 泛型实现机制

前言泛型的本质是参数化类型,就是将原来的具体的类型参数化。在不确定需要类型的情况下,通过泛型来指定具体的限制Java 的实现机制就是类型擦除,在编译的时候被擦除为 Obect类型擦除有哪些好处首先是运行时内存负担小,经过了类型擦除后,在运行期间,内存里面是不会有泛型的,只会有一个 List,所以减少了内存负担。对比下面的 C# ,在运行时泛型是真实存在的。还有就是兼容性好了,类型擦除有哪些问题基本类型无法作为泛型的实参所有就有了装箱和拆箱的类型,这就涉及到了装箱和拆箱的内存开销。但是在

2022-03-06 13:19:02 2274

原创 flutter | 悬浮窗解决方案 flutter_floating

特性全局的悬浮窗管理机制支持各项回调监听,如移动、按下等支持自定义是否保存悬浮窗的位置信息支持单页面及全局使用,可插入 N 个悬浮窗支持自定义禁止滑动区域,例如在 距离顶部 50 到底部的区域内滑动等完善的日志系统,可查看不同悬浮窗对应的 Log支持自定义位置方向及悬浮窗的各项指标支持越界回弹,多指触摸移动,自适应屏幕旋转以及小窗口等情况…依赖方式flutter_floating: ^0.0.1地址github 地址pub.dev 地址效果图全局小屏缩放屏幕

2022-02-21 13:00:50 5822 3

原创 Flutter | Image 源码阅读和使用优化

前言Image 是 Flutter 用于显示图像的小组件,它可以加载网络,本地,文件或者内存中的图像,支持 JPEG、PNG、GIF、动画 GIF、WebP、动画 WebP、BMP 和 WBMP 格式。Flutter Image 本身也实现了内存缓存的机制,可以很大的提高图片展示速度等。重温 Image 的打开方式Image.networkImage.network("图片地址",fit: BoxFit.cover,width: ,height: 400)Image.fileImage

2022-02-09 19:05:29 1961

原创 Android 集成 Flutter | 与交互

这篇文章将以如何在 Android 项目中集成 Flutter 和 如何在两者之间进行交互为主要内容。

2022-01-19 10:51:48 2429

原创 Flutter | 布局流程

浅谈布局过程Layout(布局)过程中是确定每一个组件的信息(大小和位置),Flutter 中的布局过程如下:1,父节点向子节点传递约束信息,限制子节点的最大和最小宽高。2,子节点根据自己的约束信息来确定自己的大小(Szie)。3,父节点根据特定的规则(不同的组件会有不同的布局算法)确定每一个子节点在父节点空间中的位置,用偏移 offset表示。4,递归整个过程,确定出每一个节点的位置和大小。可以看到,组件的大小是由自身来决定的,而组件的位置是由父组件来决定的。Flutter 中布局类组件有很

2022-01-05 11:50:03 1636

原创 Flutter | 启动,渲染,setState 流程

前言用了这么久 Flutter 了,居然都不知道他的启动过程,真的是学之有愧啊,今天我们来分析一下 Flutter 的启动流程,以及他的渲染过程,对其做一个简单的剖析。启动流程Flutter 的启动入口在 lib/main.dart 里的 main() 函数中,他是 Dart 应用程序的起点,main 函数中最简单的实现如下:void main() => runApp(MyApp());可以看到,main 函数中只调用了 runApp() 方法,我们看看它里面都干了什么:void run

2021-12-02 11:13:06 2440

原创 Flutter | 三棵树构建流程分析

引言在 Flutter 中,很多人都知道三棵树,最熟悉就是其中的 Widget 树了,这也是平常开发的过程中最多用到的东西,那么其他两棵树你知道是什么吗,了解他们的构建流程吗?Widget 树在开发过程中,与我们息息相关的就是 widget 了,几乎所有页面上显示的都是 widget ,Widget 是 Flutter 的核心,是用户界面的不可变描述。事实上,widget 的功能就是描述一个 UI 元素的配置数据 ,也就是说 widget 并不是最终绘制到屏幕上的元素,它只是描述显示元素的一个配置

2021-11-18 18:45:19 2446

原创 Flutter| 事件循环,Fluture

牢骚故乡容不下灵魂,他乡容不下肉身!若能一世安稳,谁愿颠沛流离。正文在 Dart 中,没有多线程的概念,所谓的异步操作全部都是在一个线程里面执行的, 并且不会造成卡顿的原因就是事件循环(Event Loop),如下图所示,在程序的运行过程中,会有两个事件补充上图:Micortask Queue 为空 才会执行 EventQueue ,EventQueue 为空时程序结束,实际上,事件循环从启动的之后会一直执行。在程序执行过程中,如果有异步操作,这个操作就会添加到队列中,当发现队列不为空时

2021-11-05 16:15:37 1980

原创 Flutter | Sliver 系列

概述CustomScrollView:一个滚动的容器,改组件不接受任何 child,但是你可以直接提供 Slivers 已创建各种滚动效果,例如页面中有多个可滑动的列表,如 Appbar, 列表,网格,等这种就可以直接使用 SliverAppBar,SliverList 和 SliverGridSlivers 不是单独指一个组件,而是指的一个系列,所以以 Sliver 开头的组件都是这个系列的,但是他们都只能作用于 CustomScrollView 中。常用到的 Sliver 有,SliverAppb

2021-08-13 18:13:38 753

原创 Flutter | 一文搞懂 BuildContext

概述[BuildContext] objects are actually [Element] objects. The [BuildContext] ,interface is used to discourage direct manipulation of [Element] objects.翻译过来的意思就是 [BuildContext] 对象实际上是 [Element] 对象。 [BuildContext] 接口用于阻止直接操作 [Element] 对象。根据官方的注释,我们可以知道 Bui

2021-08-02 15:48:33 858 1

原创 Flutter | Key的原理和使用

概述在几乎所有的 widget 中,都有一个参数 key ,那么这个 key 的作用是什么,在什么时候才需要使用到 key ?没有 key 会出现什么问题?我们直接看一个计数器的例子:class Box extends StatefulWidget { final Color color; Box(this.color); @override _BoxState createState() => _BoxState();}class _BoxState extend.

2021-06-21 20:45:00 686

原创 深入理解CAS 乐观锁 | Java

概要之前被人问到 CAS ,只知道是乐观锁,具体为什么被称为乐观锁,已经在何时使用到了它却是没有过了解,然后就简单的学习了一下,以此记录CAS(乐观锁)Synchornized 是悲观锁,线程一旦得到锁,其他的线程就只能挂起了cas 的操作则是乐观锁,他认为自己一定会拿到锁,所以他会一直尝试,知道成功拿到为止;CAS 机制CAS 英文名是 Compare And Swap 缩写,翻译过来就是比较和替换。CAS 机制中使用了三个操作数,内存地址,旧的预期的值,要修改的值;在修改一个值A的时

2021-06-03 15:08:34 178

原创 Flutter | 动画

简介在任何系统的 UI 框架中,动画的实现原理都是相同的,即:在一段时间内,快速地多次改变 UI 外观;由于人眼会产生视觉停留,所以最终看到的就是一个连续的动画;我们将 UI 的一次改变称为一个动画帧,对应一次屏幕的刷新,而决定动画流畅度的一种重要指标就是 FPS,即每秒的动画帧数。帧数越高,动画就会越流畅;一般情况下,动画帧率超过 16FPS ,就比较流畅了,超过 32FPS 就会非常细腻平滑,而超过32FPS 人眼基本就感受不到差别了,由于动画每一帧都是要改变 UI 输出,对设备的软硬件要求都较.

2021-05-08 10:08:05 728 1

原创 Flutter | 事件处理

概述在移动端,各个平台或者 UI 系统的事件模型都是基本一致,即:一次完整的事件分为三个阶段,手指按下,移动,抬起,而其他的双击,拖动等都是基于这些事件的当指针按下时,Flutter 会对应用程序执行命中测试(Hit Test) ,以确定指针与屏幕接触的位置存在哪些 Widget,指针按下事件(以及该指针的后续事件)会被分发到由命中测试发现的最内部的组件,然后从哪里开始,事件会在组件树中向上冒泡,这些事件会从最内部的组件分发的组件树的根路径上的所有组件,这个 Web 开发浏览器的事件冒泡机制相似,但是.

2021-04-01 11:20:52 584

原创 Flutter 弹出输入框导致溢出

修改:return Scaffold( resizeToAvoidBottomInset: false,}resizeToAvoidBottomInset:如果为true,则[body]和脚手架的浮动窗口小部件应自行调整大小,以避免屏幕键盘的高度由周围的[MediaQuery]的[MediaQueryData.viewInsets] bottom属性定义。例如,如果在支架上方显示了屏幕键盘,则可以调整主体的大小以避免键盘重叠,这可以防止键盘遮盖主体内部的小部件。默认为true。...

2021-03-09 12:59:22 815

原创 This error might indicate a memory leak if setState() is being called because another object is reta

E/flutter ( 4976): This error happens if you call setState() on a State object for a widget that no longer appears in the widget tree (e.g., whose parent widget no longer includes the widget in its build). This error can occur when code calls setState() fr

2021-03-09 09:39:53 2105

原创 Flutter | 布局组件

布局类组件都会包含一个或多个组件,不同的布局类组件对子组件(layout)方式不同。在 Flutter 中 Element 树才是最终的绘制树,Element 树是通过 Widget 树来创建的 (通 Widget.createElement()) ,Widget 其实就是 Element 的配置数据。在 Fluter 中,根据 Widget 是否需要包含子节点将 Widget 分为了三类,分别对应三种 Element,如下表:Widget对应的 Element用途LeafRe.

2021-03-02 10:26:37 578

原创 Glide Caused by: javax.net.ssl.SSLPeerUnverifiedException: Hostname not verified:

原因是由于服务器不被信任引起的解决办法:在 Application 的 onCreate 方法中调用下面方法即可 private fun handleSSLHandshake() { try { val trustAllCerts: Array<TrustManager> = arrayOf(object : X509TrustManager { override fun checkClientTrusted(

2021-02-26 23:19:16 1581

原创 Flutter | 常用组件

文本常用的配置class TextTest extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( body: Padding( padding: EdgeInsets.all(30), child: Column( children: <Widget>[ Text("he.

2021-02-20 12:01:27 1579

原创 Flutter | 基础 Widget

基础 Widget在 Fluter 中,几乎所有的都是一个 widget ,与原生开发不同的是,widget 的范围更加广阔,他不仅可以表示 UI 元素,也可以表示一些功能的组件,如手势检测的 widget,用于主题数据传递的 Theme 等等。所以,在大多数时候,可以认为 widget 就是一个控件,不必纠结于概念Widget 的功能是 “描述一个 UI 元素的配置数据”,widget 并不是表示最终绘制在屏幕上的显示元素,正在代绘制屏幕上的是 Element ,下面就看一下 ElementWid.

2021-02-20 12:00:18 325

原创 Android | 作用域存储适配

前言Android 10 已经发布了很长一段时间了,并且 Android 11 已经有很大一部分人在使用了,那么你的程序对他做了适配吗?在 10.0 中,作用域存储变得非常重要,这个新的功能颠覆了我们一直惯用外置存储的方式,因此大量的 app 都面临着代码的适配本篇文章对作用域存储,以及如何进行适配,做了比较详细的介绍在 7.0 以前我们访问内存卡中的文件时可以通过 Uri.fromFile ,将 File 转换成 Uri 对象,这个 uri 对象表示这本地真实路径。​ 在 7.0 后,这种.

2021-01-25 11:57:46 303

原创 Flutter | 异常处理

本文示例代码在了解 Flutter 异常捕获之前需要先了解一下 Dart 的异常处理以及 Dart 的单线程模型,只有知道了代码的执行流程,我们才能只要该在什么地方去捕获异常Dart 中的异常Dart 可以抛出和捕获异常,如果没有被捕获,则会抛出,最终导致程序终止运行和 Java 不同,Dart 中的所有异常时非检查异常,方法不会声明它们抛出的异常,也不要求捕获任何异常Dart 提供了 Exception 和 Error 类型,以及一些子类型。也可以自定义异常类型。此外,Dart 程序可以抛出任.

2021-01-20 11:53:02 755

原创 Flutter | 资源管理

Flutter 安装包中会包含代码和 assets 资源两部分,Assets 是会打包到程序安装包中的,可在运行时访问。常见类型的 assets 包括静态数据,如 json ,配置文件,图片,MP3,gif 等。加载图片例如加载一张图片,在 Flutter 中使用 pubspec.yaml 文件来管理所需要的文件在加载图片之前,需要在根目录下创建一个文件夹,里面存放图片,以及它所对应分辨率的图片如上图,创建了 images 文件夹,然后放入图片,并创建对应分辨率的文件夹,将图片放进去即可.

2021-01-18 15:25:38 330 1

原创 Flutter | 包管理

​​ 在日常开发中,很多时候需要用到第三方的 SDK ,这些 SDK 可能会被很多个项目用到,因此可以将这些代码单独抽到一个模块中,使用的时候只需要集成对于的模块即可,​ 在 Java 中,模块会被打成一个 jar 包​ 在 Android 中,模块会被打成一个· aar 包​ 一个 app 在开发的过程中可能会依赖非常多的包,这些包通常都会出现交叉依赖,版本依赖等,如果需要手动管理,则会非常麻烦,因此,各种编程语言的官方都会提供一下包管理工具,如:​ 在 Android 中提供了 G.

2021-01-12 21:44:08 163

原创 Flutter | 路由管理

什么是路由?对于移动开发者来说,路由指的就是页面,在 Android 中就是 activity,在 ios 中Wie ViewController说简单点就是映射页面跳转关系的,当然它也包含跳转相关的一切功能而路由管理则就是管理这些页面直接跳转,通信方式等示例1,创建一个新的路由,命名 NewRoute/// StatelessWidget 无状态组件class NewRoute extends StatelessWidget { @override Widget build(B.

2021-01-08 11:03:45 220

SvgToVectorDrawable.zip

下载完成后,已浏览器的方式打开 index.html ,然后导入 svg 文件,进行转换即可

2019-10-15

空空如也

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

TA关注的人

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