自学内容网 自学内容网

Java开发人员从了学习ArkTs笔记(三)-数据结构与线程通信全解析

大家好,我是一名热爱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感兴趣,不妨一试!


原文地址:https://blog.csdn.net/baobei0921/article/details/143760674

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!