- 博客(398)
- 收藏
- 关注
原创 鸿蒙OH实战开发:数据库版本升级案例
4. 版本恢复下的按钮会在升级至V1以上版本时可点击,如步骤二中升级至V2版本后,则”恢复到V1“按钮可点击,点击后数据库版本回退至V1版本。3. 点击版本升级下的”升级至V3“按钮,若当前是V1版本,则会执行V1升级至V3的逻辑,且在表格处显示V1和V3版本表格字段对比。2. 点击版本升级下的”升级至V2“按钮,则数据库版本会从V1升级至V2,且在表格处显示V1和V2版本表格字段对比。方案二:一步一步升级到最新版本,只需要实现紧邻版本的升级逻辑,优点在于逻辑简单,便于维护,缺点在于比方案一性能差。
2025-02-11 13:46:11
308
原创 鸿蒙OH实战开发:ArkTS多线性的多线程系列(三)基于单例实现跨线程缓存
单例是设计模式使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中(单进程),一个类只产生一个实例。它的优势在于:对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;由于new操作的次数减少,因此对系统内存的使用频率也会降低,这样将减少GC压力。严格来说单例模式与并行没有直接的关系,是因为它太常见了,在应用开发的过程中将不可避免的会在多线程环境中使用到它。
2025-02-10 13:50:20
1000
原创 鸿蒙OH实战开发:ArkTS多线程的多线程系列(二)基于Sendable共享对象实现跨线程通信及UI状态刷新
通过Sendable构建可跨线程共享的对象DownloadVideoInfo;主线程通过构建new taskpool.Task(downloadVideo, this.dvi)将DownloadVideoInfo共享对象同步给子线程(this.dvi是DownloadVideoInfo对象实例,downloadVideo是通过@Concurrent修饰的多线程任务);当点击启动时,通过taskpool.execute()方法启动子线程;
2025-02-09 21:36:43
655
原创 鸿蒙OH实战开发:基于Web组件的H5页面切换类点击操作响应时延问题分析思路&案例
响应起点:手指点击抬手离开屏幕响应终点:肉眼看到屏幕变化的第一帧响应时延:两处时间差值3.问题定位流程3.1 通用前置流程3.1.1 查看操作录屏辅助定位处理三方应用问题时,可以优先查看操作录屏,查看操作场景,看能否发现一些有助于定位的信息,比如1、是否有转场动效,初始动效是否明显2、页面组件是否复杂3.1.2 Trace抓取trace抓取参考:【附录1:【Web组件的H5页面切换类点击操作】抓取trace】
2025-02-09 18:58:46
990
原创 鸿蒙OH实战开发:基于List的滑动丢帧性能问题分析思路&案例
以大于300mm/s的速度,连续3次抛滑,每次半屏。抓取滑动过程Trace,查看Frame泳道中应用进程和RenderService的最大连续丢帧数。List组件的抛滑过程,可以通过应用进程下的H:APP_LIST_FLING泳道标识。性能衡量的起点为第一次抛滑开始点,衡量的结束点为第三次抛滑的结束点。
2025-02-08 21:31:48
814
原创 鸿蒙OH实战开发:瀑布流性能优化
瀑布流是应用开发中相当常见的开发场景。它通过容器自身的布局规则,将元素项目自上而下排列,在整体界面的呈现上,多列参差不齐、不停加载的形式使其内容看着像瀑布一样从上而下倾泻。借助其特点,瀑布流通常被用于展示图片资讯、购物商品、直播视频等多种形式的数据。当瀑布流上下滑动时,由于无限加载的特性,其能展示的数目非常多;大小不一的子元素,也带来了测量绘制的性能消耗。针对瀑布流这种场景进行性能优化,可以在加快渲染速度、提升滑动帧率、降低内存占用等方面,增强应用的运行效率,进而提升用户的操作体验。
2025-02-07 13:35:35
696
原创 鸿蒙OH实战开发:应用内存优化实践
本文详细介绍了HarmonyOS系统中多种减少应用内存的方法和工具,包括onMemoryLevel接口、LRUCache、生命周期管理、Purgeable Memory内存管理机制以及其他实用方法。开发者在应用开发过程中应充分利用这些工具和方法,注重内存管理,以提高应用的性能和用户体验,使应用在有限的内存资源下能够高效稳定地运行。鸿蒙应用开发与鸿蒙系统开发哪个更有前景?嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?记录一场鸿蒙开发岗位面试经历~
2025-02-06 21:27:03
865
原创 鸿蒙OH实战开发:基于ArkUI的动效能力
效果图控制输入框的宽度和显隐状态实现第一段动画,输入框的缩放动画完成后onFinish隐藏输入框,同时展示加载动画。核心代码场景二:使用 Navigation完成不同的转场动画。效果图配置完自定义的转场动画,然后将name指定的NavDestination页面信息入栈。核心代码场景三:使用 Navigation 实现一镜到底的动画效果。方案配置完自定义的转场动画,然后将name指定的NavDestination页面信息入栈,同时传参给对应页面,在跳转的页面使用onReady事件接收参数核心代码场
2025-02-06 13:57:41
247
原创 鸿蒙OH实战开发:基于webview拉起自定义键盘
整体实现效果为:通过web的同层渲染功能实现将原生TextInput组件渲染到H5需要使用自定义键盘的页面中,这样就可以实现在H5拉起自定义键盘,并且使用它的全部功能。
2025-01-23 16:17:08
527
原创 鸿蒙OH实战开发:使用Snapshot Insight分析ArkTS内存问题
问题通常会在开发的过程中逐渐积累,到最终暴露出来时可能已经涉及了多个模块、多种逻辑,各种逻辑互相耦合,导致分析的难度大大增加。这种情况下,我们建议把性能相关的工作也能做到平时,在开发态也去关心程序的性能问题。例如,刚写了一个很长的引用关系、增加了一些注册实例的逻辑或者做了一些父子组件的变量传递,这种时候就可以去结合逻辑自己设想一下,会不会引发一定的性能问题,甚至可以在平时就用调优工具来自测试。这样做到每个开发阶段都保证了性能的可靠,那么在项目日益增大的同时,性能问题也不会严重到离谱、无法分析。
2025-01-23 13:51:37
1014
原创 鸿蒙OH实战开发:基于Swiper的页面布局
1.给Swiper组件设置.nextMargin(50).prevMargin(50)属性。2.给Swiper组件添加onChange事件,设置当前this.currentIndex=index,当currentIndex为首页或者尾页时,设置上一张以及下一张图片的缩放值。// 设置当前index缩放值为最大值// 当前index=0时,设置上一张图片的缩放值} else// 当前index不为0时,设置上一张图片的缩放值// 当index为最后一张图片时,设置下一张图片的缩放值。
2025-01-22 21:51:03
264
原创 鸿蒙OH实战开发:使用Drawing实现图形绘制与显示
然而,由于它的性能依赖于浏览器的实现,不如原生API那样接近硬件,因此对于性能要求比较高绘制比较复杂或者硬件依赖性比较强的场景如高性能游戏开发、专业图形处理软件、桌面或移动应用等,使用 Canvas CanvasRenderingContext2D 绘制会存在一定的卡顿、掉帧等性能问题,此时可以直接使用 Native Drawing 接口自绘制替代 Canvas CanvasRenderingContext2D 绘制来提升绘制性能。裁剪后,只有在该区域内的绘制内容才会被显示出来,超出该区域的内容将被隐藏。
2025-01-22 13:41:31
579
原创 鸿蒙OH实战开发:基于XComponent的视频播放器高性能体验
onDataReceive回调中通过fs.writeSync传入沙箱文件的writeFd,将下载的数据流写入本地沙箱文件。配置AVPlayer的datasrc属性。设置竖屏和全屏两个按钮,分别添加点击事件。控制网络下载的起始字节和结束字节。将AVPlayer放进全局map。添加拖动手势,动态调整音量。添加拖动手势,动态调整亮度。添加拖动手势,实现seek。滑块组件滑动实现seek。
2025-01-21 21:38:41
541
原创 鸿蒙OH实战开发:应用浏览详情页场景性能优化案例
浏览详情场景是典型的长列表滑动场景,根据经验通过对接组件复用可大幅提升帧率,我们选择的目标Code Linter检测规则是**@performance/hp-arkui-use-reusable-component**,在长列表滑动的过程中,如果ListItem组件复杂,尽量使用组件复用,滑动丢帧场景下,建议优先修改。为了进一步确认导致滑动卡顿的原因,通过profiler打开应用体检结果提供的trace分析,可以看出滑动过程中组件是通过build创建出来的,耗时较长,说明没有命中组件复用。
2025-01-21 14:04:15
723
原创 鸿蒙OH实战开发:首页滑动场景性能优化案例
为了进一步分析并确认丢帧根因,用profiler打开体检结果中归档的trace信息,可以看到在滑动过程中最长帧23ms,在这一帧有29个组件刷新、590个属性设置,负载高,需要想办法降低组件的复杂度以及考虑使用组件复用减少组件创建。如果不通过性能测试工具集进行分析,开发者需要:复现问题、抓取trace、分析trace,找出丢帧问题点,操作步骤多,耗时较长。优化后性能测试工具再次测试优热门资讯页滑动的场景,滑动卡顿0次,最大连续丢帧数0帧,比优化前下降了2帧。启动检测后工具会自动全遍历应用进行滑动检测。
2025-01-20 21:37:05
589
原创 鸿蒙OH实战开发:应用推荐页滑动场景性能优化案例
为了确认设置合理的cacheCount能解决推荐页滑动卡顿的问题,通过profiler抓取trace分析,可以看出滑动过程丢帧前,帧间有大量空闲时间未利用,那么刚到cachecount就能充分利用帧间时间进行预加载,从而达到时间均摊的效果。通过性能测试工具测试发现,某应用推荐页滑动存在丢帧卡顿问题,最大连续丢帧数3-6帧。在应用推荐页列表滑动是典型的长列表滑动场景,为了提升列表滑动场景下的流畅体验,根据经验通过对接懒加载+组件复用可大幅提升帧率,我们选择的目标Code Linter检测规则。
2025-01-20 20:19:19
699
原创 鸿蒙OH实战开发:点击响应时延性能优化案例
根据告警信息中显示的调用链信息,再结合实际的业务逻辑判断问题代码行确实是会存在高频打印日志的情况,这些日志是调试定位日志,在正式发布的时候不是必需的,再按照函数调用高频程度依次优化log打印。通过性能测试工具测试发现,某应用首页点击一条新闻的响应时延121ms,页面切换响应时延推荐值为100ms,如果不通过性能测试工具集进行分析,开发者需要:复现问题、抓取trace、分析trace,找出丢帧问题点,操作步骤多,耗时较长。”规则相关的代码问题点,见下图。使用性能检测工具检测性能问题。
2025-01-20 14:58:57
317
原创 鸿蒙OH实战开发:高频开发场景案例-性能专题-应用冷启动优化
应用启动时延是影响用户体验的关键要素,当用户点击桌面应用图标、通知或其他入口启动应用,到用户的数据显示在屏幕上,如果这段时间花费的时间比较长,这样肯定会影响用户的体验。应用启动可以分为冷启动和热启动,当应用启动时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这种启动方式就叫做冷启动;而热启动是当应用程序已经在后台运行,用户再次打开应用程序时,应用程序仍然在内存中,可以直接从内存中加载并继续之前的状态,而不需要重新初始化和加载资源。
2025-01-20 13:40:24
991
原创 鸿蒙OH实战开发:基于网络的抓包能力
(这里和上面安装一样)hdcfilesendcharles.pem(电脑端上证书路径)/storage/media/100/local/files/Download/testCa.pem。2)设置caPath(默认使用系统默认路径下CA证书,如默认证书认证失败返回60需要替换为请求域名的服务器证书,项目中设置可参考常见问题Q4)A3:使用为charles证书或系统根证书无法通过https校验,需替换为请求的域名证书。Q4:user版本hdcshell证书推送失效工具,如何将证书放入设备系统?
2025-01-19 20:11:32
960
原创 鸿蒙OH实战开发:应用打包安装定位定界指南
如果只有打包后的hap文件,通过ide打开hap一般为下图的结构,可以在module.json文件和pack.info找到包管理的配置,用文本编辑器打开resources.index可以找出原工程下resource声明的string.json文件的内容。需要在生成证书请求文件后申请发布证书和Profile文件,在工程签名的地方配置上刚才申请的签名证书,编译构建.app文件后进行上架。如果是测试场景,除了在ide运行安装hap之外,也可以用bm工具命令安装,两种方式都会使用到bm工具。
2025-01-19 18:59:20
501
原创 鸿蒙OH实战开发:如何定位解决焦点问题
API11之前,未配置defaultFocus属性的情况下,当页面首次打开时,原先默认第一个可获焦的非容器组件会立即获取焦点。比如:页面初次构建完成时,使TextInput默认获取焦点,但不希望弹出键盘,则可以设置enableKeyboardOnfocus为false。defaultFocus:设置当前组件是否为当前页面上的默认焦点,仅在初次创建的页面第一次进入时生效。是获焦的能力,不一定当前焦点就在设置的组件上。一个节点获焦了,说的是它所在的焦点链获焦,也就是它和它的祖先节点都会触发onFocus。
2025-01-18 21:11:15
838
原创 鸿蒙OH实战开发:基于网络的VPN连接实现
1、项目中“jian”立"歪屁恩"Ability.ets文件,继承调用"歪屁恩"ExtensionAbility提供"歪屁恩"创建、销毁等生命周期能力。1、项目中“jian”立"歪屁恩"Ability.ets文件,继承调用"歪屁恩"ExtensionAbility提供"歪屁恩"创建、销毁等生命周期能力。如首次添加"type":"“歪屁恩”“时报红,“ctrl+左键”点击"type”,在"enum"中添加““歪屁恩””参数。1、建立"歪屁恩"_client.cpp文件,写入"歪屁恩"隧道通信有关能力。
2025-01-18 20:58:18
626
原创 鸿蒙OH实战开发:原生应用占用空间管理
webview缓存(/data/storage/el2/base/cache/web/Cache)包含于在上述文件夹中,也可以调用WebviewController.removeCache单独清理web缓存。A:fs.rmdir是递归删除,会删除该文件夹以及子文件夹中的所有文件,但是当其子目录中有高权限的文件时,调用的接口无法删除此文件,导致无法删除此文件夹,报错:Directorynotempty。定义长按手势,可以通过长按图片拉起菜单,选择删除指定图片。Q:为什么有些中文文件名的文件搜不到?
2025-01-18 19:11:02
1074
原创 鸿蒙OH实战开发:基于imageKnife对gif图的管理
实例化ImageKnifeOption后,先实例化网络请求newRequestOption(),load加载gif链接,添加监听属性addListener,回调返回拿到对象的width,height,delay。因为gif动图本质是一个播放,所以将每次拿到的帧数相加可以得到总帧数(max),经过for循环找到循环的次数maxtimes,再用总帧数除以次数得到每秒帧率avg。实例化ImageKnifeOption后,添加gif属性,将字段playTime设置传入播放的次数,即可完成播放次数的控制。
2025-01-17 17:49:27
435
原创 鸿蒙OH实战开发:基于状态变量实现复杂对象的状态监听
在上面数据模型中,Class User的字段bag是Class Bag类型,Class Book的字段bookName是Class BookName类型,这种情况都是一个对象的字段中还含有一个对象,这一类数据我们叫复杂对象,这类数据在使用状态变量监听的时候会比较麻烦,@State/@Prop等修饰器只能监听一层,也就是对象下的基本数据类型字段,对于多次嵌套的对象,在深度监听的时候需要用@Observed/@ObjectLink装饰器来进行深度观测,请看下面实现;但当对对象整体赋值时,UI却无法刷新。
2025-01-16 21:40:03
792
原创 鸿蒙OH实战开发:基于AVPlayer音频后台播放
在多个音频流同时播放场景下,如果系统不加管控,会造成多个音频流混音播放,容易让用户感到嘈杂,造成不好的用户体验。为满足应用对多音频并发策略的不同需求,音频打断策略预设了两种焦点模式,针对同一应用创建的多个音频流,应用可通过设置 焦点模式 ,选择由应用自主管控或由系统统一管控。想要实现应用后台播放,那么接入AVSession是必须的,否则业务的正常功能会同时受到限制,也必须有 BackgroundTasks Kit (后台任务管理)的能力,申请对应的长时任务,避免进入挂起(Suspend)状态。
2025-01-16 17:29:45
829
原创 鸿蒙OH实战开发:基于UI Observer实现UI组件埋点
组件埋点是一种在前端开发中常用的数据采集方法,它通过在页面中的组件(例如按钮、输入框、下拉框等)上添加跟踪代码,来收集用户的操作行为数据。这些数据可以帮助开发人员分析用户的使用习惯、行为路径等信息,从而优化产品的设计和功能。
2025-01-16 16:19:22
1080
原创 鸿蒙OH实战开发:应用内的生命周期流转
1.UIAbility组件生命周期。UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。例如在支付应用中,可以将入口功能和收付款功能分别配置为独立的UIAbility。当用户打开,切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。
2025-01-16 13:50:14
1014
原创 鸿蒙OH实战开发:基于原生能力的组件封装
应用中可基于自定义modifier扩展属性,基于@link传递属性值。如在选购商品时页面,选中之前和选中之后的样式表现不同。方案商品页面的文本组件Text并没有设置边框、背景颜色属性。通过自定义modifier为文本组件扩展设置边框、背景颜色、边框颜色属性。选择颜色、尺寸时,选择前后会表现不同的样式。核心代码1.自定义modifier继承CommonModifier ,并且定义setGroup2设置组件加载时的属性样式,定义setGroup1设置组件点击触发时的属性样式。// 组件点击时触发的样式。
2025-01-15 21:33:49
1003
原创 鸿蒙OH实战开发:基于原生能力实现图文混排
参与相对布局的容器内组件必须设置id,不设置id的组件组件不显示,容器id固定为__container__。使用StyledString实现图文混排效果,首先得让Text组件与StyledString绑定,绑定后即可使用StyledString设置文本样式以及对文本进行增、删、改、查等操作。应用中基于原生能力实现图文混排效果有多个方案可实现,推荐使用Flex作父容器实现的方案(方案一),此方案优点在于节点数量少,结构简单。内部头像使用Image组件,中间部分使用Text文本组件,右边使用Text文本组件。
2025-01-15 13:43:34
811
原创 鸿蒙OH实战开发:基于ArkUI实现类似.9图的拉伸能力
文档提供的图片,在设置了top、right、bottom、left四个参数后,图上的4角也就是1234区域不会被拉伸,关键点在于这4个参数的大小必须是原图的基础上的大小,所以需要将原图像素值转为vp后,在此基础上来确认参数。1.给Text设置背景图并将backgroundImageSize宽高都设置为100%,再使用backgroundImageResizable限定背景图拉伸区域。分别使用backgroundImageResizable和resizable实现聊天气泡的拉伸。
2025-01-14 21:34:08
334
原创 鸿蒙OH实战开发:基于原生能力的网络状态感知
netCap属性用来存储数据网络的传输能力和承载类型,主要关注其中networkCap(网络能力)和bearType(网络类型)两个属性,用来观察当前网络的能力和类型变化。基于@ohos.net.connection模块能力,监听网络可用,网络切换,网络不可用,网络丢失等事件,使用前需要调用register开启监听,监听结束后需要调用unregister关闭当前监听请求。tips:当Wi-Fi和蜂窝同时连接的时候,通过网络能力获取bearType实际只返回Wi-Fi的状态信息,此为现象为系统规格。
2025-01-14 13:52:16
311
原创 鸿蒙OH实战开发:基于TLSSocket的通信能力
用户场景需要实现网上银行叫号及其他需要建立即时通信传输数据时,可通过tcp/tlsSocket方式加密传输数据。
2025-01-13 21:15:50
886
原创 鸿蒙OH实战开发:基于@ohos.pasteboard实现剪贴板功能
使用场景:安全控件会在点击粘贴按钮时给业务临时授予ohos.permission.SECURE_PASTE权限,因此使用安全控件访问剪贴板的业务不会受此次非兼容性变更的影响,暂未使用安全控件的业务也可以通过使用安全控件访问剪贴板内容。系统剪贴板支持对文本、HTML、URI、Want、PixelMap等内容的操作。使用场景:在应用A复制口令(使用按钮复制),打开应用b后直接读取到系统剪贴板里面的口令,然后跳转到口令里面的页面。在其他场景下,请应用使用粘贴控件读取剪贴板数据,使用方式参考:场景一。
2025-01-13 14:11:17
903
原创 鸿蒙OH实战开发:事件通信能力解决方案
弹窗功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用,在一些异步回调或非UI界面中调用该接口,可能会无法跟踪到当前UI的上下文,导致接口执行失败,不能正常打开弹窗。所以当使用Eventhub传递事件时需要使用 promptAction.openCustomDialog 保证拿到同一UI上下文,才能正常打开弹窗。
2025-01-12 22:08:04
651
原创 鸿蒙OH实战开发:H5通过url scheme拉起对应应用
id=xxx&funNum=xxx&type=xxx’,点击该按钮,打开网页web端收到的url为’hwtips://com.huawei.hmos.tips.app?2.在被拉起方的module.json文件中的skill字段中配置该应用支持的scheme协议,表示这个应用可以通过此协议打开,例如玩机技巧应用想被成功拉起则需要玩机技巧应用在工程的model.json5文件中配置abilities的skills中配置scheme。
2025-01-12 20:28:26
601
原创 鸿蒙OH实战开发:基于Code Linter实现代码检查
codelinter检查的结果,用户可以选择不改,又或者不想检查出来,就可以/* eslint-disable */屏蔽,但只能屏蔽有Ignore图标的。在工程根目录下创建code-linter.json5配置文件,可对于代码检查的范围及对应生效的检查规则进行配置,ruleSet和rules配置项共同确定了生效的 规则范围。在已打开的代码编辑器窗口单击右键点击Code Linter,或在工程管理窗口中鼠标选中单个或多个工程文件/目录,右键选择Code Linter执行代码检查。
2025-01-10 22:10:14
720
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人