大家好,我是一名热爱Java开发的开发人员。目前,我正在学习ARKTS(Advanced Java Knowledge and Technology Stack),并将不断输出我的学习笔记。我将在这里分享我学习ARKTS的过程和心得,希望能够为其他开发人员提供一些有价值的参考和帮助。让我们一起探索ARKTS的奥秘,共同进步!
ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。本文,主要是对ArkTs常用数据结构,进行实际使用、总结输出。
1.疑问、探索
1.1 疑问一:在哪里?
前面两文,我们学完了arkts基础知识、函数、类,接下来,想要看一下arkts支持的数据结构有哪些?可是一查官方文档,居然
突然产生了很大的疑惑,那arkts如果实现key-value、list等数据的存储呢?
抱着试一试的态度,在代码中,如下编码
好在,IDE给了我们提示,要求
import { HashMap } from '@kit.ArkTS';
我们顺势,点击查看一下这个包里面的类和方法有哪些。
/** Copyright (c) 2022-2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//*** @file* @kit ArkTS*/import buffer from '@ohos.buffer';
import convertxml from '@ohos.convertxml';
import process from '@ohos.process';
import taskpool from '@ohos.taskpool';
import uri from '@ohos.uri';
import url from '@ohos.url';
import ArrayList from '@ohos.util.ArrayList';
import util from '@ohos.util';
import Deque from '@ohos.util.Deque';
import HashMap from '@ohos.util.HashMap';
import HashSet from '@ohos.util.HashSet';
import LightWeightMap from '@ohos.util.LightWeightMap';
import LightWeightSet from '@ohos.util.LightWeightSet';
import LinkedList from '@ohos.util.LinkedList';
import List from '@ohos.util.List';
import PlainArray from '@ohos.util.PlainArray';
import Queue from '@ohos.util.Queue';
import Stack from '@ohos.util.Stack';
import TreeMap from '@ohos.util.TreeMap';
import TreeSet from '@ohos.util.TreeSet';
import Vector from '@ohos.util.Vector';
import worker, {DedicatedWorkerGlobalScope, ErrorEvent, Event, EventListener, EventTarget,MessageEvent, MessageEvents, PostMessageOptions, ThreadWorkerGlobalScope,WorkerEventListener, WorkerEventTarget, WorkerOptions
} from '@ohos.worker';
import xml from '@ohos.xml';
import JSON from '@ohos.util.json';
import lang from '@arkts.lang';
import ArkTSUtils from '@arkts.utils';
import collections from '@arkts.collections';
import stream from '@ohos.util.stream';
import Decimal from '@arkts.math.Decimal';export {ArrayList, convertxml, DedicatedWorkerGlobalScope, Deque, ErrorEvent, Event, EventListener,EventTarget, HashMap, HashSet, LightWeightMap, LightWeightSet, LinkedList, List, MessageEvent,MessageEvents, PlainArray, PostMessageOptions, Queue, Stack, ThreadWorkerGlobalScope, TreeMap,TreeSet, Vector, WorkerEventListener, WorkerEventTarget, WorkerOptions, buffer, process, taskpool,uri, url, util, worker, xml, JSON, lang, ArkTSUtils, collections, stream, Decimal
};
这一看,就柳暗花明了,原来都在这里,而且,大家也可以发现,这些动动,和java居然基本一样。
1.2 疑问二:原理上怎么实现的?
但是新的疑问来了,这个实现是怎么样的?难道arkts底层自己把这些数据结构实现了一遍?带着这个疑问,我们随便点击一个,例如hashmap,看一下它的实现是怎么样的?
我们一看这个类,hashmap拥有的功能,基本都有。但是有一个问题,随便看一个方法,他没有实现呀?那怎么做的呢?
我们就不绕弯子了,还是翻到开头,这个类的定义开头,有一个关键字declare
declare class HashMap<K, V> {
在arkts中,我们可以使用declare关键字声明一个JavaScript模块,并通过import关键字将其导入到TypeScript代码中。然后,我们就可以像调用TypeScript函数一样调用JavaScript函数。
这下,这个疑问也就解答了,原来,arkts并未去重新实现这些数据结构,而是直接导入了JS的实现。
当然了,这时,可能会有小伙伴问,arkts、TypeScript、JavaScript到底有啥区别呢?
1.3 AS/TS/JS区别
区别与联系,这个我们借用官方的一段描述来说明一下,大家肯定就明白了。
JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。
TypeScript 是 JavaScript 的一个超集,它扩展了 JavaScript 的语法,通过在JavaScript的基础上添加静态类型定义构建而成,是一个开源的编程语言。
ArkTS兼容TypeScript语言,拓展了声明式UI、状态管理、并发任务等能力,可以认为是TypeScript的超集。
由此可知,TypeScript是JavaScript的超集,ArkTS则是TypeScript的超集,他们的关系如下图所示。
2. 常用数据结构实践
接下来,我们对这个包 '@kit.ArkTS 中,常用的一些类和方法,做一下实践使用。
2.1 Hashmap
let map = new HashMap<number, string>();
map.set(1, "1")
map.set(2, "2")
map.set(3, "3")
map.forEach((value, key) => {console.log("key = " + key + "value = " + `${value}`);
});
2.2 ArrayList
let list = new ArrayList<Person>();
list.add(new Person("xiaoming", 23))
list.add(new Person("sdsad", 23))
for (let listElement of list) {console.log(listElement.name + "" + listElement.age)
}
2.3 HashSet
let mySet = new HashSet<string>();
mySet.add("key1")
mySet.add("key2")
mySet.forEach((value)=> {console.debug(value)
})
if (mySet.has("key1")) {}
2.4 Stack
let myStack = new Stack<string>()
myStack.push("fds")
myStack.push("fdsfds")
let fafdf = myStack.pop()
myStack.forEach((value) => {console.debug(value)
})
3.线程间通信
看这个 ‘@kit.ArkTS’,大家发现没有一个东东,觉得特别感兴趣,就是这个类:
这玩意,从名字看,就是线程类的方法。让我忍不住兴趣去研究一下,本来本文最初只决定研究一下常用数据结构的,看到这个,忍不住就扩充一下了。
我们带着疑问去看这个知识点,大家有没有一个疑问?android主子线程直接交互,有handler、thread、eventbus等,那arkts有不?
这个答案是很确定的,有的。
3.1 使用Worker进行线程间通信
Worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。
Worker的开发步骤如下:
3.1.1 build-profile.json5配置
在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息。
"buildOption": {"sourceOption" : {"workers" : ["./src/main/ets/works/works.ets"]}}
3.1.2 编写worker.ts
根据build-profile.json5中的配置创建对应的worker.ts文件。
import { worker } from '@kit.ArkTS'let handleMessage = worker.workerPort// 处理来自主线程的消息
handleMessage.onmessage = (message) => {console.debug("message " + message)// 发送消息给主线程handleMessage.postMessage("send message to main thread")
}
3.1.3 初始化和使用worker
主线程中使用如下方式初始化和使用worker
let workmsg = new worker.ThreadWorker("/works/works")// 发送消息到worker线程
workmsg.postMessage("message from main thread.")// 处理来自worker线程的消息
workmsg.onmessage = (message) => {console.info("message from worker: " + message);// 根据业务按需停止worker线程workmsg.terminate();
}
3.2 使用Emitter进行线程间通信
上面提到了,android 有eventbus这样的三方库,大家使用起来很简单,那么arkts有吗?答案是,有的。就是Emitter。
Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。
Emitter的开发步骤如下:
3.2.1 订阅事件
@Sendable
class Sample {constructor() {this.count = 100;}printCount() {console.info('Print count : ' + this.count);}count: number;
}let callback = (eventData: emitter.GenericEventData<Sample>): void => {let storage: Sample = eventData.data!;storage.printCount();
};// 订阅eventId为"eventId"的事件,并在接收到此事件时执行上述定义的callback函数
emitter.once("eventId", callback);
3.2.2 发送事件
// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);
4.总结
本文对arkts,数据结构和线程通信机制有了更深刻的理解。ArkTS不仅继承了TypeScript的语法,还拓展了一系列高效的数据结构,如HashMap、ArrayList、HashSet等,这些数据结构的使用方法与Java非常相似,大大提升了开发效率。
此外,ArkTS的线程通信机制也让我印象深刻。通过使用Worker和Emitter,我们可以轻松实现线程间的数据传递和事件处理,这对于构建高性能应用至关重要。
总的来说,ArkTS是一门非常强大的编程语言,其数据结构和线程通信机制为我们提供了丰富的工具,让我们能够更高效地开发出优质的应用。如果你也对ArkTS感兴趣,不妨一试!