HarmonyOS开发:Log工具类源码分析

news2024/12/24 19:50:43

前言

一转眼就十月中旬了,国庆的劲真大,到现在还未缓过来,以至于要更新的文章迟迟未发布,大家可以看到,最近一段时间的文章,都是关于HarmonyOS相关的,两个原因吧,一是我司有这样的任务安排,要对HarmonyOS进行技术储备和鸿蒙版项目复刻,二就是,HarmonyOS在Api9之后推广了自身的ArkTs语言,和之前兼容AOSP有很大的出入,一门新的语言,难免有很多未知的东西,而现实的资料有的也十分匮乏,基于此,便想着把自己所研究,所封装的给记录下来,方便自己或者他人能够更及时的了解HarmonyOS;当然了移动端的其他技术,也会时不时的穿插分享。

还有一点需要说的是,目前很多的三方,比如登录、分享、地图、推送等等,尚未出鸿蒙版的SDK,也就是说,目前的开发,只能是纯原生的开发,有些功能想开发,但是呢,条件还未达到,除了三方的SDK之外,很多常见的组件或者功能,基于ArkTs语言的实现,也是匮乏的可怜,所以,就需要广大的开发者,不断地奉献了,目前一段时间地研究,已经封装了Log日志库,网络库,Dialog库和刷新加载库,再接下来地时间里,我也会一一分享出来。

上上篇文章,开源了一个Log日志库,其实本身没有什么难的,无非就是拓展了些许功能,让打印更加方便一点,控制台中更加好看一些,除此之外,并没有其他的特点,但是呢,作为一个简单地封装,如何进行实现的,本篇也简单地给大家刨析一下。

使用方式

关于使用,这里不再重复讲述了,大家可以直接看上篇文章,或者直接看源码也行。

初始化

初始化的作用,提前设定一定的参数,用于后续的代码使用或控制一定的操作流程,在初始化中,针对Log日志这一块,我们可以统一设置输出日志的Tag,日志输出的级别,日志选择的打印类型,是否关闭日志等等操作。

默认初始化属性

主要定义了一些默认的值,防止参数未传递值为空的情况。

  private static mTag: string = "HarmonyOSLog"
  private static mDomain: number = 0x0000
  private static mClose: boolean = false
  private static mHilog: boolean = true //默认是用hilog进行打印
  private static mShowLogLocation: boolean = true //展示点击的位置
  private static mLogSize = 800 //打印的最大长度,默认是800

init设置初始化

通过传递自定义的LogOptions对象,来改变默认的属性。

static init(object: LogOptions) {
    const tag: string = object.tag //日志输出Tag
    const domain: number = object.domain //日志输出级别
    const close: boolean = object.close //是否关闭日志
    const isHilog: boolean = object.isHilog //是否是hilog打印
    const showLogLocation: boolean = object.showLogLocation //是否展示日志位置
    const logSize: number = object.logSize //日志输出大小
    if (tag != undefined) {
      this.mTag = tag
    }
    if (domain != undefined) {
      this.mDomain = domain
    }
    if (close != undefined) {
      this.mClose = close
    }
    if (isHilog != undefined) {
      this.mHilog = isHilog
    }
    if (showLogLocation != undefined) {
      this.mShowLogLocation = showLogLocation
    }
    if (logSize != undefined) {
      this.mLogSize = logSize
    }

  }

LogOptions

export class LogOptions {
  tag?: string
  domain?: number
  close?: boolean
  isHilog?: boolean
  showLogLocation?: boolean
  logSize?: number
}

LogOptions是一个对象,在init初始化方法中也可以直接传递Object类型,也是一种方式,但是没有传递直接的对象方便,因为直接的对象类型,限制了传递的参数,只能传递定义的,如下所示:

所以,在以后的日常开发中,对于限制级别的参数传递,大家也可以采取这种指定类型的参数传递。

防止打印不全

由于系统限制,hilog应该打印的长度为1024个字符,那么在打印内容特别多的情况下,会显示不全,这样不利于日志的直观查看,我们需要对超出一定字符长度的内容进行截取,采取分段打印。

  const len = content.length / this.mLogSize
    for (var i = 0; i < len; i++) {
      var con = content.substring(i * this.mLogSize, (i + 1) * this.mLogSize)
      if (i != 0) {
        con = "|" + con
      }
      //进行打印
    }

mLogSize为自己定义的每次打印长度。

对象转Json

特殊的情况下,为了更加直观的打印出Json串或者一个对象,我们需要对此进行格式化处理,如下效果:

首先判断传递的打印信息是否是一个对象或者是一个Json串,对象好判断,直接判断是否等于object即可,但是一个Json串,就得另想办法了,这里我判断的是起始字符是否包含大括号,当然这种,具有一定的局限性,有可能它是一个错误的Json,虽然起始有大括号,但是中间是错的,这种情况下,就会格式化错误。

当然了,还有一种方式判断,也就是json串转对象方式,如果转换成功,那么json串就是一个正确的,再进行判断即可。

      var type = typeof message
      if (type == "object") {
        //是对象
        message = this.getObjectToJson(message)
      } else if (type == "string") {
        //判断是否包含大括号
        const content = message + ""
        if (content.startsWith("{") && content.endsWith("}")) {
          //对象
          const obj = JSON.parse(message)
          message = this.getObjectToJson(obj)
        } else {
          message = content
        }
      }

打印格式化操作:

  /*
   *对象转Json
   * */
  private static getObjectToJson(message: object): String {
    const json = JSON.stringify(message, null, 2)
    const endMessage = json.replace(/\n/g, "\n|    ")
    return endMessage
  }

总结

日志的打印没什么好说的,要说有些许难点,也就是对象转Json格式化的时候,遇到了一定阻碍,其他的都很简单,下一篇,我们将带来基于http,封装一个便捷的网络请求,敬请期待!

源码地址:

Github:https://github.com/AbnerMing888/HarmonyOsLog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据结构、算法与应用C++语言描述》使用C++语言实现数组双端队列

《数据结构、算法与应用C语言描述》使用C语言实现数组双端队列 定义 队列的定义 队列&#xff08;queue&#xff09;是一个线性表&#xff0c;其插入和删除操作分别在表的不同端进行。插入元素的那一端称为队尾&#xff08;back或rear&#xff09;&#xff0c;删除元素的那一…

网站二级域名怎么部署SSL证书?

二级域名是在主域名下创建的子域名&#xff0c;常用于区分不同功能或部门的网站。随着互联网的发展&#xff0c;越来越多的网站开始采用二级域名来构建更灵活和个性化的网站结构&#xff0c;保护二级域名的数据安全也变得至关重要。为了确保二级域名的安全性&#xff0c;申请SS…

python爬虫requests.get乱码问题

爬取百度图片的时候res.text出现乱码&#xff1a; 解决&#xff1a; 删除请求头中的接受编码项

当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

excel表格怎么设置数据超链接?

在Excel表格中&#xff0c;可以设置超链接来快速导航到其他单元格、工作表、文件、网页等。下面我将详细介绍如何设置数据超链接。 1. 在Excel表格中选择要添加超链接的单元格或文本。 2. 使用鼠标右键点击选定的单元格&#xff0c;然后选择“超链接”选项&#xff0c;或者在…

2023下半年信息系统集成设计师案例

案例题 重要的知识点容易忽略的知识点不错的小题合同管理配置管理变更管理成本管理招标管理人力资源管理质量管理风险管理沟通管理立项和需求 能说专业术语&#xff08;比喻十大领域管理不足&#xff09;就说&#xff0c;没法说的大白话也没问题 重要的知识点 如果题目没有说从…

Bazzite:专为 Steam Deck 和 PC 上的 Linux 游戏打造的发行版

导读对于一个专为 Linux 游戏定制的发行版&#xff0c;你是否感兴趣呢&#xff1f;如果答案是肯定的&#xff0c;那么我们为你准备了绝佳选择。 Bazzite 是一个新推出的基于 Fedora 的发行版&#xff0c;它是为 Linux 桌面上的游戏&#xff0c;以及越来越火热的 Steam Deck 定…

必不可少的UI组件二——组件库开发的基础知识(工程化篇)

组件库工程化概述 在 必不可少的UI组件——组件库开发的基础知识(Vue篇) 中&#xff0c;我们介绍了一些封装 Vue 组件的过程中高频使用到的框架技巧&#xff0c;但是&#xff0c;这并不足以支持我们实现完善的组件库。 建设一个成熟的组件库就像盖一幢大楼&#xff0c;工程化…

开发从0 到1获取代码,提交,推送

1,首先我们要下载git 2,下载一个github desktop 3,下载好git 后拉取代码 git clone 克隆的地址 4&#xff0c;克隆好项目后&#xff0c;配置git 密钥到你的账号上 4.1没有有密钥怎么生成&#xff1f; git config --global user.name "xxx" git config --globa…

无线射频收发芯片:Si24R2F

Si24R2F是一款2.4GHz超低功耗有源RFID标签系统的SoC单芯片&#xff0c;集成嵌入式2.4GHz无线射频发射器模块、64次可编程NVM存储器模块以及自动发射控Z器模块等。 Si24R2F支持4通道轮询发射&#xff0c;4个信道可以轮流发射不同的数据&#xff0c;从而增加系统卡片容量。同时支…

温湿度实时监测,这个方法太强了!

温湿度监控是现代社会中一个日益重要的技术领域&#xff0c;它不仅涉及到人们的日常生活&#xff0c;也在各种产业和领域中发挥着至关重要的作用。随着科技的不断进步&#xff0c;我们对环境条件的监测和控制需求愈发增强。 客户案例 制药行业 在制药行业&#xff0c;药品的质量…

Si24R2H无线射频芯片 125KHz唤醒功能

​ 产品信息: Si24R2H-2.4GHz无线发射单芯片 集成嵌入式基带 发射频率范围&#xff1a;2400MHz~2525MHz 接收频率范围&#xff1a;15KHz~150KHz 支持2Mbps、1Mbps和250Kbps三种发射数据速率 产品功能: 1、高精度的位置定位 2、测温和报J 3、实现与手机的联动 4、外W设…

后台管理系统SQL注入漏洞

对于edu来说&#xff0c;是新人挖洞较好的平台&#xff0c;本次记录一次走运的捡漏0x01 前景 在进行fofa盲打站点的时候&#xff0c;来到了一个后台管理处看到集市二字&#xff0c;应该是edu站点 确认目标身份&#xff08;使用的quake进行然后去ipc备案查询&#xff09; 网…

wps表格求标准差怎么算?

在WPS表格中&#xff0c;要计算标准差&#xff0c;可以使用STDEV函数。标准差是一种衡量数据集合离散程度的统计指标。下面我将详细介绍如何使用STDEV函数来计算标准差。 STDEV函数的语法为&#xff1a;STDEV(range) 其中&#xff0c;range表示要计算标准差的数据范围&#x…

视频怎么压缩?视频过大这样压缩变小

在日常生活中&#xff0c;我们常常会遇到需要压缩视频的情况&#xff0c;视频压缩不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以在保证质量的同时&#xff0c;满足不同的使用需求。那么&#xff0c;如何有效地压缩视频呢&#xff1f; 方法一&#xff1a;嗨…

云函数cron-parser解析时区问题

1、问题 云函数部署后cron-parser解析0点会变成8点 考虑可能是时区的问题 然后看文档发现果然有问题&#xff0c;云函数环境是utc0 2、解决 看了半天cron-parser文档发现 Using Date as an input can be problematic specially when using the tz option. The issue bein…

爬虫学习日记第八篇(爬取fofa某端口的协议排行及其机器数目,统计top200协议)

需求 找到最常用的200个协议 通过fofa搜索端口&#xff0c;得到协议排名前五名和对应机器的数目。 遍历端口&#xff0c;统计各个协议对应的机器数目&#xff08;不准&#xff0c;但能看出个大概&#xff09; 读写API API需要会员&#xff0c;一天只能访问1000次。 import…

用护眼灯到底好不好?好用热门的护眼台灯推荐

现在市面上做护眼灯的品牌非常多&#xff0c;有的是脚踏实地&#xff0c;真正做保护消费者眼睛的产品&#xff0c;有的则是夸大宣传&#xff0c;以次充好来收割很多不明真相的群众。其实护眼灯的防蓝光是做不到完全无蓝光的&#xff0c;那些宣传完全无蓝光的商家&#xff0c;完…

doc与docx文档转html,格式样式不变(包含图片转换)

最近做一个富文本的需求&#xff0c;要求把文档内容转换到富文本内&#xff0c;文档中的格式也好&#xff0c;样式也好&#xff0c;图片啥的都要一致展示&#xff1b;踩了不少坑&#xff0c;据说word文档其实是一个压缩包&#xff0c;我不是特别清楚但是也能理解&#xff0c;自…

爬虫用什么库更事半功倍?

1、首先&#xff0c;我们需要安装 TypeScript 和 superagent 库。在命令行中运行以下命令来安装它们&#xff1a; npm install typescript npm install superagent2、创建一个新的 TypeScript 项目&#xff0c;并在项目中创建一个名为 crawler 的文件夹。在 crawler 文件夹中&a…