- 博客(382)
- 资源 (4)
- 收藏
- 关注
原创 Jetpack Compose 1.7中的新修饰符receiveContent
不仅可以接受软键盘中输入的图片,同时它也可以接受你从其他地方复制到剪贴板中的图片内容,可以粘贴到输入框中输入。,通过该修饰符可以支持在输入框中输入输入法软键盘中自带的图片表情等,非常方便。在 Jetpack Compose 1.7.0 中提供了一个新的修饰符,中存在的bug,并且支持许多新特性,在未来我们应该尽量选择使用。集成,以接受由软件键盘或通过剪贴板粘贴操作提供的富媒体内容。是官方正在优化的实验性版本,它修复了许多。要使用 coil 加载gif,还需要在。
2024-02-28 10:00:00
859
原创 Jetpack Compose 中使用一次性事件是一种反模式吗?
正如 UI 层的其他注意事项部分中提到的,如果你的用例需要的话,你可以使用多个流公开屏幕的 UI 状态。我们相信,这种方法可以为你提供更多的交付和处理保证,通常更容易测试,并且可以与应用程序的其他部分一致性的进行集成。如果你很难找到一种方法来减少一次性 ViewModel 事件的状态,请重新考虑该事件对你的 UI 的实际含义。这是一种反模式,因为如果我们从事务的角度考虑, UI 层中建模的支付结果状态不是持久的或原子的。应该公开实际的应用程序数据(在本例中为支付数据),而不是告诉 UI 要采取的操作。
2024-02-28 09:00:00
1420
原创 Jetpack Compose 性能优化的几条建议
加了它之后,在 Layout Inspector 中就可以看到重组次数为0,跳过重组的次数有很多(本该重组的次数)。,我们在 Layout Inspector 中观察列表快速滑动的时候,会发现列表出现红色闪烁,这说明发生了重组。我们可以使用三方的图片加载库,如coil,因为图片加载库一般会缓存,同一张图片不会重复加载第二次,还可以根据尺寸压缩等。部分,详细的介绍了稳定类型需要满足的准则,以及什么样的类型是稳定类型或者不稳定类型。,可以优化列表的加载性能,避免多余的重组。不是一个稳定的类型,会导致重组。
2024-02-28 08:00:00
1812
原创 Jetpack Compose 中 mutableStateOf 和 mutableIntStateOf 的区别
版本能提升不少性能,因为避免了在高频重组过程中的自动装箱和频繁的GC。其实 Kotlin 编译器会在背后默默的帮你处理拆装箱问题,简单来说,如果你单独使用一个。而第二种写法,就是真实的基本数据类型,是对应的 Java 的。其实要理解它为啥这样做,首先得理解 Kotlin 中的自动装箱问题。由于自动拆装箱有性能损耗,出于性能考虑,在Kotlin中,定义变量,那么背后对应的就是真实的基本数据类型。在一些动画类的场景中,使用基本类型的。,它是对应泛型的,也就是前面说的。中时,是对应的 Java 的。
2024-02-28 07:30:00
672
原创 Jetpack Compose:实现图片的 Pinch Zoom 从未如此简单
可见 Jetpack Compose 短短几十行代码就实现了传统 View 体系中动辄需要上千行的代码,简直不要太简洁,不仅清晰易懂,而且还易维护。Compose 实现图片的手势操作比传统 View 简便太多了,在传统 View 体系中,如果要对。其实就是放大后的矩形宽度比原始矩形宽度多出的部分,显然此时左右移动的时候,左边和右边不应该超出。限制了偏移量的移动范围,在往左边拖动的时候,不能超过左边的。的回调函数中所做的事情,为了简化,我们可以先将上面。的一半,往右边拖动的时候,同样不能超过右边的。
2024-02-27 13:14:12
1349
原创 在 Room 数据库中使用事务处理联表操作
这三块代码的操作不是原子性的,假设第一块代码向数据库插入成功了,但是在跑第二块代码时应用崩溃了,第三块代码就没有执行,从而导致bug。同样的,如果第一块代码和第二块代码执行成功了,但是第三块代码执行失败了,前面部分的操作也不会回滚,从而导致bug。方法中对数据库表的操作,要么全部成功,要么全部失败,即便在中间某个操作应用崩溃了,也不会只执行了一半,即保证事务是原子性的。更多关于 Room 数据库中对象与对象之间的关系定义,请参考。正确的处理方法是使用 Room 数据库中的。注解,在其中执行相关的表操作。
2024-02-27 13:11:08
801
原创 Jetpack Compose 状态管理的三个误区
但是作为开发者应该有这样的意识,一旦用户有这样的需求,我们就可以立即修改代码来达到需求。如果应用回到后台,随时有可能因为内存不足而被系统杀死,这时用户从最近应用程序列表中返回时,会发现应用界面从头开始,上次看到的状态丢失。当中,然后用户继续浏览,然后用户又切到其他应用,此时当前应用因为某种原因进程被杀死重启(如内存不足),那么这个时候 object。值增加之后,回到后台去做其他事情,此时应用因为内存不足被系统杀死,用户再次返回应用,应用会重启,用户看到的将会是初始值 0。(View system),以及。
2024-02-27 13:00:03
1374
1
原创 使用 Koltin 集合时容易产生的 bug 注意事项
可以看到这个问题的解决并非难事,非常简单,困难的是如何发现这种问题,如果没有并发安全的意识,可能只能对着应用抛出的异常日志发呆而无从下手。所以,如果你没有意识到集合类可能在多线程下导致的并发安全问题,一旦产生这样的bug或异常,就会很棘手,很难发现问题的原因。的消息了,因为被线程 1 删除了一个,消息列表不够 4 个了,这种情况下,你的应用可能会得到某种类似于。类的相关方法,那么不会有任何问题,但是假如你在多个线程中调用这个类,比如在线程池中跑,那就不一定了。类那样,每次操作都会产生一个新的不可变。
2024-02-27 07:30:00
603
原创 Kotlin 协程中容易让人忽视的 Cancellation 陷阱
启动的协程作用域没有被真正取消,这与我们的预期不符,当用户按下返回键关闭页面时,我们期望的是取消协程中正在后台执行的上传任务,否则这容易导致内存泄漏。,该异常不会取消它的父协程,这个异常通常会被忽略静默处理,但是假如你捕获了该异常,那么父协程就不会感知到任何取消通知,也就不会取消协程。注意,检测协程是否被已被取消,最好是在循环中,或者如果没有循环逻辑则每隔一段代码调用一次检测,所以上面读取文件的代码最好不要使用。这个示例的问题在于,协程的取消可以是在任何时机,不一定在某个方法当中,例如在。
2024-02-26 08:21:55
1365
原创 3 个Android Kotlin 小技巧教你做人:好的编码习惯胜过好的编码技术
在没有使用 Kotlin 之前,使用Java的时候,或许你有封装过一些工具类来做类似的事情,但是下面我们看一下如何通过 Kotlin 的属性代理的方式来简化类似这种读写数据的逻辑。中读取的,这样将读写的逻辑隐藏在了背后,开发者只需要读,但不需要关心具体是怎么读的,能够更好的把精力放在纯业务问题上。),但这不并妨碍本文以此作为示例来演示问题所在,如果你有其他的比较复杂的读写逻辑想要简化,其实处理方式是类似的。现在的问题是,如果这个接口的调用者在不看注释的情况下,如何知道这个方法的返回值代表的是一个。
2024-02-26 07:30:00
1205
原创 《现代C++语言核心特性解析》笔记(三)
二十四、三向比较(C++20)1. “太空飞船”(spaceship)运算符C++20标准新引入了一个名为“太空飞船”(spaceship)的运算符 <=>,它是一个三向比较运算符。<=> 之所以被称为“太空飞船”运算符是因为 <=> 让著名的Perl语言专家兰德尔·L.施瓦茨想起1971年的一款电子游戏《星际迷航》中的太空飞船。读者应该也看出来了,<=> 并不是 C++20首创的,实际上Perl、PHP、Ruby等语言早已支持了三向比较运算符,C++是后
2024-01-05 19:04:28
1639
1
原创 【React系列】ES6学习笔记(四)module、编程风格
其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。模块加载 3 个方法,其他方法不加载。ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
2024-01-05 14:18:11
1555
原创 【React系列】ES6学习笔记(二)Promise、async\await
本文参考自电子书《ECMAScript 6 入门》:https://es6.ruanyifeng.com/Promise 对象1. Promise 的含义Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了 Promise 对象。所谓 Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以
2024-01-05 14:15:53
2440
原创 【React系列】ES6学习笔记(一)let与const、解构赋值、函数参数默认值\rest参数\箭头函数、数组和对象的扩展、Set和Map等
本文参考自电子书《ECMAScript 6 入门》:https://es6.ruanyifeng.com/let 和 const 命令1. let 命令尽量使用 let 声明变量,而不是 var。let 声明的变量是块级作用域, var 声明的变量是全局作用域。使用 let 变量必须先声明再使用,否则报错,不存在变量提升。相对的 var 声明的变量如果提前使用,不会报错,只会提示为undefined。let不允许在相同作用域内,重复声明同一个变量。ES6的块级作用域允许使用多层 {}
2024-01-05 14:10:33
1510
原创 【React系列】网络框架axios库的使用
目前前端中发送网络请求的方式有很多种:选择一:传统的是基于选择二: 在前面的学习中, 我们经常会使用选择三: Fetch API选择四:axios支持多种请求方式:注意:下面的测试我都会使用https://httpbin.org这个网站来测试,是我个人非常喜欢的一个网站;我们来发送一个请求:你也可以直接发送,那么就不需要传入(当然不传入默认也是请求)当然,你也可以使用在中发送网络请求:那么,有错误的时候,中如何处理呢?使用来处理错误信息发送多个并发的请求:选读:axios(config)和axio
2024-01-03 00:28:50
1807
原创 【React系列】Hook(二)高级使用
自定义Hook本质上只是一种函数代码逻辑的抽取,严格意义上来说,它本身并不算React的特性。需求:所有的组件在创建和销毁时都进行打印组件被创建:打印组件被创建了;组件被销毁:打印组件被销毁了;console.log("组件被创建了");console.log("组件被销毁了");}, [])return (console.log("组件被创建了");console.log("组件被销毁了");}, [])console.log("组件被创建了");
2024-01-03 00:09:21
1340
原创 【React系列】Hook(一)基本使用
Hook 是 React 16.8 的新增特性,它可以让我们在不编写class的情况下使用state以及其他的React特性(比如生命周期)。我们先来思考一下class组件相对于函数式组件有什么优势?classstateclasshooksclassrender所以,在Hook出现之前,对于上面这些情况我们通常都会编写class组件。
2024-01-02 23:24:13
1667
原创 【React系列】Redux(三) state如何管理
我们来看一下目前我们的reducerreducercounterhomecounterhome如果将所有的状态都放到一个reducer中进行管理,随着项目的日趋庞大,必然会造成代码臃肿、难以维护。reducer我们先抽取一个对counter处理的reducer再抽取一个对home处理的reducer如果将它们合并起来呢?
2024-01-02 21:55:50
1082
原创 【React系列】Redux(二)中间件
在之前简单的案例中,redux中保存的counter是一个本地定义的数据,我们可以直接通过同步的操作来state就会被立即更新。但是真实开发中,redux中保存的很多数据可能来自服务器,我们需要进行异步的请求,再将数据保存到redux中。在之前学习网络请求的时候我们讲过,网络请求可以在class组件的中发送,所以我们可以有这样的结构:HomebannersrecommendsProfilebannersrecommends在reducer.js中添加state初始化数据和reducer中添加。
2024-01-02 21:40:36
1456
原创 【React系列】Redux(一)管理状态
上面的代码是否可以实现react组件和redux结合起来呢?当然是可以的,但是我们会发现每个使用的地方其实会有一些重复的代码:比如监听store数据改变的代码,都需要在中完成;比如派发事件,我们都需要去先拿到store, 在调用其dispatch等;能否将这些公共的内容提取出来呢?我们来定义一个connect函数:这个connect参数一:里面存放component希望使用到的State属性;参数二:里面存放component希望使用到的dispatch动作;这个connect在中的。
2024-01-02 19:32:20
1192
原创 【React系列】React中的CSS
事实上,css 一直是 React 的痛点,也是被很多开发者吐槽、诟病的一个点。.vueVue在CSS上虽然不能称之为完美,但是已经足够简洁、自然、方便了,至少统一的样式风格不会出现多个开发人员、多个项目采用不一样的样式风格。
2024-01-02 17:52:44
1622
1
原创 【React系列】Portals、Fragment
某些情况下,我们希望渲染的内容独立于父组件,甚至是独立于当前挂载到的DOM元素中(默认都是挂载到id为root的DOM元素上的)。childfragmentcontainer通常来讲,当你从组件的render步骤一:修改index.html添加新的节点
2024-01-02 17:19:59
1114
原创 【React系列】高阶组件
什么是高阶组件呢?相信很多同学都听说过,也用过 高阶函数,它们非常相似,所以我们可以先来回顾一下什么是 高阶函数。JavaScript中比较常见的都是高阶函数。高阶组件并不是React API的一部分,它是基于React的组合特性而形成的;withRouter在我们的开发中,高阶组件可以帮助我们做哪些事情呢?
2024-01-02 17:02:13
1188
原创 【React系列】受控非受控组件
在React中,HTML表单的处理方式和普通的DOM元素不太一样:表单元素通常会保存在一些内部的。如果要使用非受控组件中的数据,那么我们需要使用。在每次按键时都会执行并更新 React 的。表单的处理,这里我们再演示一下其他的情况。来获取对应的DOM呢?标签的使用也非常简单,只是它不需要通过。函数式组件是没有实例的,所以无法通过。,因此显示的值将随着用户输入而更新。而在 React 中,可变状态(在 HTML 中,表单元素(如。)之类的表单元素通常自己维护。属性,因此显示的值将始终为。
2024-01-02 16:36:06
1049
原创 【React系列】非父子组件通信—Context.Provider共享数据、events库事件总线通信
前面通过Context主要实现的是数据的共享,但是在开发中如果有跨组件之间的事件传递,应该如何操作呢?在Vue中我们可以通过Vue的实例,快速实现一个事件总线(EventBus),来完成操作;在React中,我们可以依赖一个使用较多的库events来完成对应的操作;我们可以通过npm或者yarn来安装eventsevents创建eventBus对象;eventBus.emit("事件名称", 参数列表);eventBus.addListener("事件名称", 监听函数);
2024-01-02 15:59:05
1557
原创 【React系列】父子组件通信—props属性传值
AppMainAppHeaderHeaderHeaderMainBanner总之,在一个React项目中,组件之间的通信是非常重要的环节;props。
2024-01-02 15:35:39
1483
原创 【React系列】React生命周期、setState深入理解、 shouldComponentUpdate和PureComponent性能优化、脚手架
一. 生命周期1.1. 认识生命周期很多的事物都有从创建到销毁的整个过程,这个过程称之为是生命周期;React组件也有自己的生命周期,了解组件的生命周期可以让我们在最合适的地方完成自己想要的功能;生命周期和生命周期函数的关系:生命周期是一个抽象的概念,在生命周期的整个过程,分成了很多个阶段;比如装载阶段(Mount),组件第一次在DOM树中被渲染的过程;比如更新过程(Update),组件状态发生变化,重新更新渲染的过程;比如卸载过程(Unmount),组件从DOM树中被移除的过程;
2024-01-02 14:54:07
1488
原创 【React系列】JSX核心语法和原理
在ES6之前,我们通过function来定义类,但是这种模式一直被很多从其他编程语言(比如Java、C++、OC等等)转到JavaScript的人所不适应。原因是,大多数面向对象的语言,都是使用class关键字来定义类的。而JavaScript也从ES6开始引入了class关键字,用于定义一个类。ES6之前定义一个Person转换成ES6中的类如何定义呢?类中有一个构造方法,当我们通过new关键字调用时,就会默认执行这个构造方法。构造方法中可以给当前对象添加属性。
2024-01-02 12:54:18
1303
原创 Git 常用命令知识笔记
分支,你可以当作是个干净的主线,每次新来一个需求的时候你都可以以该分支为基准,新建一个分支进行开发,最后进行合并,并由这个基准分支(本地。当 Git 不知道怎么合并某两处冲突的修改时,会中断自动合并,并对冲突文件进行标记。公钥文件中的内容全部复制,以使用 gitlab 仓库为例,打开gitlab,找到。分支是可以删掉的,并不一定要提交到远程,不然远程仓库里会有很多冗余分支。和你什么时候创建的它无关,也和仓库的起点无关,只和它当前指向哪个。,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)
2023-12-31 18:10:04
893
原创 Git 命令拉取分支、忽略已经提交的文件
文件,下次提交也是不会被忽略的,这个文件只针对尚未被提交的文件进行忽略起作用。注意,已经提交到Git服务器的文件,即便你更新了。忽略掉目标文件,然后提交即可。(如果本地没有提交则会丢失)如果报错,可尝试加上。
2023-12-31 16:52:24
1020
原创 如何理解面向对象的OO设计原则和设计模式?
高层模块不应该依赖低层模块,二者都应依赖其抽象;抽象不应依赖细节,细节应该依赖抽象。模块间的依赖关系通过接口或抽象类发生,实现类之间不发生直接的依赖关系。开发者不能干预这些生命周期,只能选择在某一个回调中处理。单一职责、开闭原则、里氏替换、接口隔离、依赖倒置。一个类应该仅有一个引起它变化的原因。一个对象应该对其他对象有最少的了解。(知道的太多,可能活不到剧终)。客户端不应该依赖它不需要的接口。面向接口编程,或面向抽象编程。面向接口编程,或面向抽象编程。永远不要过早的依赖细节。接口隔离原则 ISP。
2023-12-31 07:38:06
1195
原创 《深入理解JAVA虚拟机笔记》并发与线程安全原理
如果出现两条以上的线程争用同一个锁的情况,那轻量级锁就不再有效,必须要膨胀为重量级锁,锁标志的状态值变为“10”,此时Mark Word中存储的就是指向重量级锁(互斥量)的指针,后面等待锁的线程也必须进入阻塞状态。不过这种读取到“半个变量”的情况是非常罕见的,经过实际测试,在目前主流平台下商用的64位Java虚拟机中并不会出现非原子性访问行为,但是对于 32 位的 Java 虚拟机,譬如比较常用的32位x86平台下的HotSpot虚拟机,对long类型的数据确实存在非原子性访问的风险。
2023-12-30 07:15:40
953
原创 《深入理解JAVA虚拟机笔记》编译与优化
方法内联的优化行为理解起来是没有任何困难的,不过就是把目标方法的代码原封不动地“复制”到发起调用的方法之中,避免发生真实的方法调用而已。在一般应用中,完全不会逃逸的局部对象和不会逃逸出线程的对象所占的比例是很大的,如果能使用栈上分配,那大量的对象就会随着方法的结束而自动销毁了,垃圾收集子系统的压力将会下降很多。)〉的技术,这是整个应用程序范围内的类型分析技术,用于确定在目前已加载的类中,某个接口是否有多于一种的实现、某个类是否存在子类、某个子类是否覆盖了父类的某个虚方法等信息。根据上面的分析可知,
2023-12-29 14:07:49
969
原创 《深入理解JAVA虚拟机笔记》运行时栈帧、方法分派、动态类型
Java 虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。每一个方法从调用开始至执行结束的过程,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。在 Java 编译程序代码时,栈帧中需要多大的局部变量表,需要多深的操作数栈就已经被分析计算
2023-12-29 13:19:30
1406
原创 《深入理解JAVA虚拟机笔记》类加载机制
这个阶段的验证是基于二进制字节流进行的,只有通过了这个阶段的验证后,这段字节流才允许进入java虚拟机内存的方法区中进行存储,所以后面的三个验证阶段全部是基于方法区的存储结构上进行的,不会再直接读取,操作字节流了。正如OSGi中的类加载器的设计不符合传统的双亲委派模型的类加载器架构,且业界对其为了实现热部署而带来的额外的高复杂度还存在不少争议,但对这方面有了解的技术人员基本还是能达成一个共识,认为OSGi中对类加载器的运用是值得学习的,完全弄懂了OSGi的实现,就算是掌握了类加载器的精粹。
2023-12-29 09:01:19
948
原创 《深入理解JAVA虚拟机笔记》Class文件格式、字节码指令
之所以要专门使用这样一个属性去记录泛型类型,是因为Java语言的泛型采用的是擦除法实现的伪泛型,字节码(Code属性)中所有的泛型信息编译(类型变量、参数化类型)在编译之后都通通被擦除掉。Code属性是Class文件中最重要的一个属性, 如果把一个Java程序中的信息分为代码(Code, 方法体里面的Java代码) 和元数据(Metadata, 包括类、 字段、 方法定义及其他信息) 两部分, 那么在整个Class文件里, Code属性用于描述代码, 所有的其他数据项目都用于描述元数据。
2023-12-29 08:28:06
1233
Android性能优化学习源码
2023-11-26
Android内存OOM优化详解.pdf
2023-11-26
Android中进程的ADJ值.pdf
2023-11-26
C++参考手册C++参考手册C++参考手册C++参考手册
2023-11-01
Android类加载机制、插件化、热修复
2023-10-24
RangSeekBar
2023-10-21
Android JNI中C++层与Java层的对象交互实例
2023-10-16
JNI技术之动态注册与JNI线程.pdf
2023-10-16
ffmpeg处理音视频流程
2023-10-16
音视频入门基础知识笔记
2023-10-16
音视频编解码相关的基础知识点
2023-10-16
Android做的视频播放器MediaPlayer
2012-08-12
MediaPlayer
2012-07-31
TA创建的收藏夹 TA关注的收藏夹
TA关注的人