鸿蒙(HarmonyOS)开发体验

Harmony 发展

鸿蒙的发展其实有一段时间了,并且随着鸿蒙的发展一直都有两方面的争议,一方认为鸿蒙是基于Android开发的操作系统,质疑鸿蒙只是把外表改了的Android;另一方则认为鸿蒙是华为自主研发的操作系统,在智能手机和智能平板应用上采用的与Android兼容。

随着今年8月份 HarmoneyOs4的发布,并表示后续的Harmony NEXT将不基于Android,这一系列的争论看起来已经结束了。华为官方宣称不兼容Android后将压缩优化40%的代码,应该指的就是HarmonyOs中兼容Android的那部分AOSP的代码。

因为如果要兼容Android的话,这部分AOSP的代码是肯定会要存在的,站在华为的立场也可以理解,比较系统的推广离不开生态,唯一的办法,就是在安卓的基础上,先进行逐步的替换修改,保持对安卓的兼容性,降低APP提供商的开发成本,让系统先面世。然后系统面世后,逐步扩大用户数量,提升知名度,扩大影响力。有了一定的影响力和基础,才能去和更多的APP提供商和开发者合作,让他们针对我的系统,去开发APP,构建生态。

照目前来看,鸿蒙已经是走到了构建生态的这一步来了。

我们可以看下鸿蒙开发者的官网,其实已经很完善了。从IDE,到相关的课程文档,到Codelabs都是配套齐全的,完全够我们开发者上手和入门了,并且由于是中文文档,确实体验比谷歌的机器翻译的文档要易懂不少😂。

Harmony 开发

  • 严格来讲,Harmony 开发应该指的是两部分,应用开发 和 设备开发。设备开发指的是比如芯片/模组/开发板之类的硬件与鸿蒙的兼容或通讯,场景是智能家居一类的,毕竟OpenHarmony初衷是万物互联嘛。 而我们这里讲的是应用开发。

IDE 和 开发语言

首先开发用的IDE是HUAWEI DevEco Studio,是基于IDEA开发的,所以和Android Studio比起来,不能说毫无关系,只能说是一模一样。这对安卓开发者来说还是很友好的。

然后开发语言是arkts,它是基于TypeScript(简称TS)基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。并且借助ArkUI的框架,提供了声明式UI、状态管理的能力,用起来还是比较简洁的。

开发体验

鸿蒙原生的开发,官方给出了两套开发模型,一套是基于Java或Js的FA模型,对应的版本是API 8也就是Harmony3.0及以前,这种就是xxAbility,被吐槽看起来很像Android的Activity的开发方式。

不过随着鸿蒙的发展,Java已经不再受支持了,现在官方推荐的就是刚才提到的基于ArkTs的Stage模型,提出了AbilityStage、WindowStage等类作为应用组件和Window窗口的"舞台",两个模型的差异官网也给出了详细的说明,我这里依然使用的官方主推的Stage模型开发。

ArkUi开发体验

一个简单的计数器Demo,借助arkTs的注解(ts里面叫装饰器)完成对状态的管理,ui开发用的是声明式的语法,熟悉Flutter或者React的同学应该很亲切。整个写法看起来还是很简洁的。

ts 复制代码
@Entry
@Component
struct ParentComponent {
  @State number: number = 0

  build() {
    Stack() {
      Text(`${this.number}`)
        .fontSize(26)
        .position({ x: '50%', y: '50%' })
      Button() {
        Image($r('app.media.ic_public_add'))
          .width(50)
          .height(50)
      }
      .width(60)
      .height(60)
      .position({ x: '80%', y: 600 })
      .type(ButtonType.Circle)
      .backgroundColor(0xFFFFFF)
      .onClick(() => {
        this.number++
      })
    }
  }
}

TypeScript

简单介绍一下TypeScript,TypeScript是由微软开发的一款开源的编程语言。 其官方对它的定义是Typed JavaScript at Any Scale.添加了类型系统的 JavaScript,适用于任何规模的项目。

首先Ts完全兼容Js,Typed的意思是在JavaScript的基础上,增加了静态类型的检查。

动态/静态类型

我们知道语言按照「类型检查的时机」来分类,可以分为动态类型和静态类型。动态类型是指在运行时才会进行类型检查,优点是写代码很灵活方便,不用去写非常多的类型定义,缺点就是代码质量参差不齐,维护成本高,比如有些错误在编译期不会报错,而在运行时会报错。这样的缺点对于一个大型项目来说是很致命的。

而TypeScript 是静态类型的语言,所以能在编译阶段就会进行类型检查,有问题就会报错,为开发者提供了便利。

强/弱类型

强类型是指变量定义后,不允许改变变量的数据类型,除非进行强制类型转换。相反,弱类型就是指变量的值其类型是宽泛的,可以被赋值多种类型的值。

举例来说这段代码在js中是可以正常运行的:

ts 复制代码
let a = 1;
a = 'a';

按理来说,ts是完全兼容javaScript的,既然完全兼容,那么照网上的一些说法,ts应该也是属于弱类型的语言。

但是上面这段代码放在ts中,编译器就会提示 Type 'string' is not assignable to type 'number'.(不能将类型"string"分配给类型"number") 这个其实是ESLint 提供的代码检查功能,我试了一下,因为这段代码虽然飘红,但是运行起来是没问题的。

也就是说ts虽然是弱类型的语言,但在开发的体验上,是能避免写出弱类型的代码的。

总之,ts就是对Js加了类型的检查,所以ts比之于js会更适合大型项目的开发与维护。而鸿蒙的ArkTs也是完全兼容Ts语法的。

语言发展

上面说的一些对比可以看出javaScript的一些不足和对大型项目开发的限制,这里也顺便聊聊TypeScript的发展故事。

2011 年 9 月,网络上出现了一封标题为"Future of JavaScript"的谷歌内部邮件,邮件中表明,由于 Javascript 语言发展缓慢,谷歌内部正在开发一门比 JavaScript 更好的 web 语言。

这门新语言的目标是实现 JavaScript 所能实现的一切功能。它的主要目标是"保持 JavaScript 的动态特性,但要有更好的性能,配置文件,并能适应大型项目的工具"。它还可以交叉编译成 JavaScript。这种语言作为技术预览版向更广泛的世界发布,并命名为 Dart

对,Dart其实和Ts的初衷一样,都是为了成为更好的Javascript,而且两门语言的面世时间其实差不多,dart面世于2011年,ts面世于2012年,紧随其后;dart是由Google团队开发,ts的背后团队是微软,两者在一段时间内是竞争关系。

后来dart在与typescript竞争中'谁才是更好的js'中输给了ts(这里的"竞争"并不是指语言和技术层面上的竞争,也有可能商业和市场层面上的竞争)反正最终的结果是Ts如今作为更好的js,已经在各大前端框架上普及,react,vue和Angular都在积极的支持与使用ts。

而dart在沉静了一段时间后则借助Flutter和跨平台的兴起,再次出现在公众面前。

所以,单从语言本身来说,三者是有很多的相似之处的。比如js和dart都是单线程的,js可以通过浏览器的多线程去完成长时间耗时任务,dart可以通过平台通道。所以我们来看看ts在鸿蒙上是怎么执行长时间耗时任务的。

多线程支持

并发和多线程

  • 异步并发是指异步代码在执行到一定程度后会被暂停,以便在未来某个时间点继续执行,这种情况下,同一时间只有一段代码在执行。如:aysnc/promise

  • 多线程并发允许在同一时间段内同时执行多段代码。在主线程继续响应用户操作和更新UI的同时,后台也能执行耗时操作,从而避免应用出现卡顿。

HarmonyOs对多线程的开发提供了两种方式,TaskPool和Worker

示例

ts 复制代码
import Prompt from '@system.prompt'
import taskpool from '@ohos.taskpool';
import worker from '@ohos.worker';

@Entry
@Component
struct ParentComponent {
  @State number: number = 0

  build() {
    Column({ space: 20 }) {
      LoadingProgress().width(100).height(100)
      Button("setTimeout执行耗时任务")
        .onClick(() => {
          longTaskWithTimeOut()
        })
      Button("taskPool执行耗时任务")
        .onClick(() => {
          doWithTaskPool()
        })
      Button("worker执行耗时任务")
        .onClick(() => {
          doWithTaskPool()
        })
    }.width("100%").height("100%")
  }
}

function longTask(): string {
  console.log("开始长任务");
  const startTime = Date.now();
  while (Date.now() - startTime < 1000) {
  }
  console.log(`执行完毕长任务,耗时${(startTime - Date.now())}ms`);
  return "ok"
}


async function longTaskWithTimeOut() {
  let result: string = await new Promise<string>((success, error) => {
    setTimeout(() => {
      success(longTask());
    }, 0);
  })
  Prompt.showToast({ message: `result is ${result}` })
}


@Concurrent
function task() {
  const startTime = Date.now();
  while (Date.now() - startTime < 1000) {
  }
  return "ok"
}

/**
 * 适合单个完整的任务
 */
function doWithTaskPool() {
  const tmpTask = new taskpool.Task(task)
  taskpool.execute(tmpTask).then(result => {
    Prompt.showToast({ message: `Result : ${result}` })
  })
  // const promise: Promise<unknown> = taskpool.execute(tmpTask)
  // const data = await promise
}

function doWithWorker() {
  const tmpWorker = new worker.ThreadWorker(`entry/src/main/ets/workers/DemoWorker.ts`);
  tmpWorker.onmessage = result => {
    Prompt.showToast({ message: `Result : ${result}` })
  }
  // 向Worker子线程发送Get消息
  tmpWorker.postMessage({ data: "data" })
  // tmpWorker.terminate()
}taskpool.execute(tmpTask)
  // const data = await promise
}
ts 复制代码
// worker.ets
import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker';

var workerPort: ThreadWorkerGlobalScope = worker.workerPort;
workerPort.onmessage = function (e: MessageEvents) {
  const startTime = Date.now();
  while (Date.now() - startTime < 1000) {
  }
  workerPort.postMessage("ok")
}

👀关注公众号:Android老皮!!!欢迎大家来找我探讨交流👀

相关推荐
前端菜鸟日常8 小时前
鸿蒙Arkts开发飞机大战小游戏,包含无敌模式,自动射弹,暂停和继续
华为·harmonyos
HMS Core9 小时前
【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(3)
华为·harmonyos
前端菜鸟日常1 天前
鸿蒙版(ArkTs) 贪吃蛇,包含无敌模式 最高分 暂停和继续功能
华为·harmonyos
鸿蒙布道师1 天前
鸿蒙NEXT开发数值工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
塞尔维亚大汉2 天前
鸿蒙南向开发 ——轻量系统芯片移植指南(二)
物联网·嵌入式·harmonyos
别说我什么都不会2 天前
OpenHarmony内核系统调用hats测试用例编写指南
物联网·嵌入式·harmonyos
90后的晨仔2 天前
鸿蒙ArkTS是如何实现并发的?
harmonyos
鸿蒙布道师2 天前
鸿蒙NEXT开发日期工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
HMSCore2 天前
在应用内购票、寄件时,如何一键填充所需信息?
harmonyos
HarmonyOS_SDK2 天前
在应用内购票、寄件时,如何一键填充所需信息?
harmonyos