当前位置: 首页 > news >正文

网站建设与营销经验shodan搜索引擎

网站建设与营销经验,shodan搜索引擎,知名的网站制作公司需要多少钱,用什么软件制作图片【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象#xff1a; 常见的崩溃问题表现为#xff0c;应用操作后白屏闪退#xff0c;或者应用显示无响应卡死。 2.定位问题#xff1a; 发现崩溃后#xff0c;我们首先需要了解复现步骤#x…【HarmonyOS Next】鸿蒙应用崩溃处理思路详解 一、崩溃问题发现后定位 1. 崩溃现象 常见的崩溃问题表现为应用操作后白屏闪退或者应用显示无响应卡死。 2.定位问题 发现崩溃后我们首先需要了解复现步骤精确定位复现步骤。因为提供复现步骤得人可能是用户和测试非开发人员其中的步骤并非最短路径。 3.排查问题点 根据复现步骤我们需要查看日志表现鸿蒙的DevEco IDE提供了日志看板根据HiLog和FaultLog我们可以初步区分崩溃问题的类型。 根据日志看板的FaultLog可以查看崩溃输出的 JS Crash一般是ArkTS原生逻辑的崩溃CppCrash一般是NDKC层的崩溃 JS Crash 点击进入JS Crash中可以查看到崩溃信息以下几种类型的错误 可以根据JS Crash提示的错误行数直接点击跳转到错误代码处根据提示检查和修复问题。 Device info:xxx Build info:xxx-xxx x.x.x.xxx(xxxx) Fingerprint:a370fceb59011d96e41e97bda139b1851c911012ab8c386d1a2d63986d6d226d Module name:com.xxx.xxX Version:1.0.0 Versioncode:1000000 PreInstalled:No Foreground:Yes Pid:39185Uid:20020145 Reason:TypeError Error name:TypeError Error message:Cannot read property needRenderTranslate of undefined Stacktrace:Cannot get SourceMap info, dump raw stack:at anonymous (entry/src/main/ets/pages/Index.ts:49:49) this.translationUpY (this,multiCardsNum 1)? sceneContainerSessionListlthis.multiCardsNum -、 1].needRenderTranslate.translateY :0 this.translationDownY (this.multiCardsNum 2)? sceneContainerSessionList[this.multiCardsNum - 2].needRenderTranslate.translateY :0;CppCrash 根据日志提示检查是否有以下错误情况 AppFreeze 一般是由于耗时操作导致堵塞主线程。此时用户操作时会触发无响应。一般分为以下三种情况超时时间一般在6s左右。 内存泄漏 这种问题排查起来是最麻烦的所以保持良好的代码编程规范不需要的对象该释放释放不用的句柄也需要释放。 一般碰到内存泄漏根据提供的复现步骤很多情况下是非必现。如果是必现那最好了修复该问题会很快。我们需要操作复现步骤使用鸿蒙DevEco IDE的ProFiler工具 检测应用操作时的内存使用情况。 二、问题解决检查类似错误情况一起修复 1.根据章节一问题定位清楚后根据错误具体情况思考修复方案 2.根据问题情况检查其他代码是否有同类问题一起修复后验证。 3.根据官网提供的材料进行学习编码过程中进行规范和排查 性能优化举例 业务场景是点击跳转下一页直接加载Web页面。这是大多数三方应用的实现方式其实应该在后台创建一个ArkWeb组件来预先启动用于渲染的Web渲染进程。这样跳转到web页面的时间就不会那么长 // 创建NodeController // common.ets import { UIContext } from kit.ArkUI; import { webview } from kit.ArkWeb; import { NodeController, BuilderNode, Size, FrameNode } from kit.ArkUI;// Builder中为动态组件的具体组件内容 // Data为入参封装类 class Data {url: string https://www.example.com;controller: WebviewController new webview.WebviewController(); }Builder function webBuilder(data: Data) {Column() {Web({ src: data.url, controller: data.controller }).domStorageAccess(true).zoomAccess(true).fileAccess(true).mixedMode(MixedMode.All).width(100%).height(100%).onPageEnd((event) {// 输出Web页面加载完成时间console.info(load page end time: ${Date.now()});})} }let wrap wrapBuilderData[](webBuilder);// 用于控制和反馈对应的NodeContainer上的节点的行为需要与NodeContainer一起使用 export class MyNodeController extends NodeController {private rootnode: BuilderNodeData[] | null null;private root: FrameNode | null null;private rootWebviewController: webview.WebviewController | null null;// 必须要重写的方法用于构建节点数、返回节点挂载在对应NodeContainer中// 在对应NodeContainer创建的时候调用、或者通过rebuild方法调用刷新makeNode(uiContext: UIContext): FrameNode | null {console.info( uicontext is undefined : (uiContext undefined));if (this.rootnode ! null) {const parent this.rootnode.getFrameNode()?.getParent();if (parent) {console.info(JSON.stringify(parent.getInspectorInfo()));parent.removeChild(this.rootnode.getFrameNode());this.root null;}this.root new FrameNode(uiContext);this.root.appendChild(this.rootnode.getFrameNode());// 返回FrameNode节点return this.root;}// 返回null控制动态组件脱离绑定节点return null;}// 当布局大小发生变化时进行回调aboutToResize(size: Size) {console.info(aboutToResize width : size.width height : size.height);}// 当controller对应的NodeContainer在Appear的时候进行回调aboutToAppear() {console.info(aboutToAppear);}// 当controller对应的NodeContainer在Disappear的时候进行回调aboutToDisappear() {console.info(aboutToDisappear);}// 此函数为自定义函数可作为初始化函数使用// 通过UIContext初始化BuilderNode再通过BuilderNode中的build接口初始化Builder中的内容initWeb(url: string, uiContext: UIContext, control: WebviewController) {if (this.rootnode ! null) {return;}// 绑定预创建的WebviewControllerthis.rootWebviewController control;// 创建节点需要uiContextthis.rootnode new BuilderNode(uiContext);// 创建动态Web组件this.rootnode.build(wrap, { url: url, controller: control });}// 此函数为自定义函数可作为初始化函数使用loadUrl(url: string) {if (this.rootWebviewController ! null) {// 复用预创建组件重新加载urlthis.rootWebviewController.loadUrl(url);}} }// 创建Map保存所需要的NodeController let NodeMap: Mapstring, MyNodeController | undefined new Map(); // 创建Map保存所需要的WebViewController let controllerMap: Mapstring, WebviewController | undefined new Map();// 初始化需要UIContext 需在Ability获取 export const createNWeb (url: string, uiContext: UIContext) {// 创建NodeControllerlet baseNode new MyNodeController();let controller new webview.WebviewController();// 初始化自定义web组件baseNode.initWeb(url, uiContext, controller);controllerMap.set(url, controller);NodeMap.set(url, baseNode); };// 自定义获取NodeController接口 export const getNWeb (url: string): MyNodeController | undefined {// 加载新的Url时建议复用预创建的Web组件if (!NodeMap.get(url) NodeMap.get(about://blank)) {// 获取预创建的Web组件let webNode NodeMap.get(about://blank) as MyNodeController;// 重新加载urlwebNode.loadUrl(url);return webNode;}return NodeMap.get(url); };三、思考如何避免问题再次发生复盘 1.保持好的开发习惯创建踩坑文档避免自己第二次再发生该问题 2.根据错误情况分析是否为自己代码逻辑问题逻辑bug不可避免只能从开发经验和code review中尽量避免 3.代码容错分支问题只保证了主流程未考虑代码错误分支的覆盖情况。这种情况需要自己吸取教训避免再次发生。 4.使用检测工具对代码进行扫描提前规避一些问题 5.使用IDE提供的AppAnglyzer生成应用检测报告。根据报告提示进行修改 6.使用鸿蒙提供的DevEco Testing工具进行稳定性和功耗等测试
http://www.sczhlp.com/news/157391/

相关文章:

  • 5种可以给网站带来流量的方式沈阳恢复营业通知
  • 怎么建一个公司运营网站做网站 天津
  • 网站开发公司代理dede怎么做视频网站
  • 专门做网站的公司有哪些h5网站建站
  • 做项目的招聘网站网站开发交接协议书
  • 博客网站注册太原做网站公司
  • 网站设计公司费用网站没建好可以备案吗
  • 通州郑州阳网站建设兰州网站建设优化制作公司
  • 优化网站seo全国工商信息公示系统
  • 那个网站可以找人做兼职长春火车站什么时候通车
  • 网站建设涉及的标准外贸工厂的网站建设
  • 目字形布局结构的网站免费建立自己喜欢的盒
  • 做美食哪些类型网站国内做的比较好的网站是什么
  • 网站底部流程有哪些专业做饰品的网站app
  • 2025机械加工供货厂家权威口碑排行:实力与服务深度解析!
  • NOIP 集训日记 2.0
  • 解码AVL树
  • LinuxWindows环境下Nacos3.1.0详细安装部署指南:从零到生产就绪
  • 哪里有建设网站中的视频c h5网站开发
  • 大型网站的设计室内装修公司需要什么资质
  • 家里的电脑ip做网站怎么查看网站域名
  • 百度竞价渠道代理商seo优化效果怎么样
  • 网站建设相关参考资料巴州建设局网站
  • 中信建设 官方网站wordpress博客采集
  • 海口专业做网站广州自助建站模板
  • 环保部建设项目影响登记网站以太坊网站开发
  • 网站建设合理流程福泉市自己的网站
  • 做外包的网站有哪些flashfxp 上传网站
  • 变更网站做推广需要备案适合大学生创业的网站建设类型
  • 苏州正规制作网站公司山东中恒建设集团网站