社区编辑申请
注册/登录
OpenHarmony—分布式数据对象之功能实践
系统 OpenHarmony
通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

分布式数据对象之功能实践

分布式数据对象管理框架是一款面向对象的内存数据管理框架,向应用开发者提供内存对象的创建、查询、删除、修改、订阅等基本数据对象的管理能力,同时具备分布式能力,满足超级终端场景下,相同应用多设备间的数据对象协同需求。

1、 基本概念

分布式数据对象提供JS接口,让开发者能以使用本地对象的方式使用分布式对象。

2、 运作示意图

3、约束与限制

  • 不同设备间只有相同bundleName的应用才能直接同步。
  • 不建议创建过多分布式对象,每个分布式对象将占用100-150KB内存。
  • 每个对象大小不超过500KB。
  • 支持JS接口间的互通,与其他语言不互通。

4、开发指导

(1) 接口说明

引用分布式对象头文件:

import distributedObject from '@ohos.data.distributedDataObject'

接口:

DistrubutedObject:

5、 开发步骤

(1) 引入接口

import distributedObject from '@ohos.data.distributedDataObject'

(2) 创建对象

// 创建对象,对象包含3个基本属性:name,age和isVis;2个复杂属性:parent,list
var g_object = distributedObject.createDistributedObject({name:undefined, age:undefined, isVis:true, parent:undefined, list:undefined});

说明:**构造分布式对象时,新增了默认SESSION_ID属性,并为各属性增加了set和get方法,其构造方法如下所示:

const SESSION_ID = "__sessionId";
class Distributed {
constructor(obj) {
this.__proxy = obj;
Object.keys(obj).forEach(key => {
Object.defineProperty(this, key, {
enumerable: true,
configurable: true,
get: function () {
return this.__proxy[key];
},
set: function (newValue) {
this.__proxy[key] = newValue;
}
});
});
Object.defineProperty(this, SESSION_ID, {
enumerable: true,
configurable: true,
get: function () {
return this.__proxy[SESSION_ID];
},
set: function (newValue) {
this.__proxy[SESSION_ID] = newValue;
}
});
this.__objectId = randomNum();
console.info("constructor success ");
}

//------------------------------------------------------其余内容此处省略

__proxy;
__objectId;
}

(3) 加入同步组网

发起方:

用distributedObject.genSessionId()方法生成随机字符串,并设置为对象的__sessionId属性的值。

g_object.setSessionId(distributedObject.genSessionId());

说明:**setSessionId不仅设置了SESSION_ID属性的值,也重新打包了对象,增加了该SESSION_ID对应同步组网的内容,具体方法如下:

setSessionId(sessionId) {
if (sessionId == null || sessionId == "") {
leaveSession(this.__proxy); //退出同步组网
return false;
}
if (this.__proxy[SESSION_ID] == sessionId) {
console.info("same session has joined " + sessionId);
return true;
}
leaveSession(this.__proxy); //退出同步组网
//加入sessionId值对应的同步组网,返回新生成的对象
let object = joinSession(this.__proxy, this.__objectId, sessionId);
if (object != null) {
this.__proxy = object;//替换新生成的对象
return true;
}
return false;
}

被拉起方:

发起方将sessionId通过Intent传到对端设备,被拉起方获取Intent中的sessionId,执行setSessionId加入同步组网完成数据同步。

//sessionId与发起方的__sessionId一致
g_object.setSessionId(sessionId);

(4) 监听对象变更

开启change监听,当同步组网内对象属性value发生变化时,触发用户自定义回调changeCallback。

changeCallback : function (sessionId,  changeData) {
console.info("change" + sessionId + " " + this.response);
if (changeData != null && changeData != undefined) {
changeData.forEach(element => {
console.info("changed !" + element + " " + g_object[element]);
});
}
}
g_object.on("change", this.changeCallback);

(5)修改对象属性

g_object.name = "jack";
g_object.age = 19;
g_object.isVis = false;
g_object.parent = {mother:"jack mom",father:"jack Dad"};
g_object.list = [{mother:"jack mom"}, {father:"jack Dad"}];
// 对端设备收到change回调,fields为name,age,isVis,parent和list

说明: 针对复杂类型的数据修改,目前支持对根属性的修改,暂不支持对下级属性的修改。示例如下:

//支持的修改方式
g_object.parent = {mother:"mom", father:"dad"};
//不支持的修改方式
g_object.parent.mother = "mom";

(6) 访问对象

console.info("name " + g_object["name"]); //访问到的是组网内最新数据

(7)删除监听数据变更

//删除变更回调changeCallback
g_object.off("change", changeCallback);
//删除所有的变更回调
g_object.off("change");

(8) 监听分布式对象的上下线

开启status监听,当同步组网内有对象在线状态发生变化时,触发用户自定义回调statusCallback。

statusCallback : function (sessionId, networkid, status) {
this.response += "status changed " + sessionId + " " + status + " " + networkId;
}
g_object.on("status", this.changeCallback);

(9) 删除监听分布式对象的上下线

//删除上下线回调changeCallback
g_object.off("status", changeCallback);
//删除所有的上下线回调
g_object.off("status");

(10)退出同步组网

//两种方式均可
g_object.setSessionId("");
g_object.setSessionId();

6 、内部实现

(1) 主要接口

class DistributedObjectStoreImpl : public DistributedObjectStore
{
public:
DistributedObject *CreateObject(const std::string &sessionId) override;
uint32_t DeleteObject(const std::string &sessionId) override;
//此处的watch主要针对change监听
uint32_t Watch(DistributedObject *object, std::shared_ptr<ObjectWatcher> watcher) override;
uint32_t UnWatch(DistributedObject *object) override;
//其余内容省略
}

(2)调用顺序

7 、总结

通过本文的学习可了解到分布式数据对象的主要接口、大致调用方法和功能实现等。结合对应内容,可以进一步对分布式数据对象同步机制做深度学习。

下一步:

(1) 着重理解同步组网的构建原理。

(2) 着重理解同步组网内,监听change和status变化的实现。

​想了解更多内容,请访问:​

​51CTO和华为官方合作共建的鸿蒙技术社区​

​https://ost.51cto.com​

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2022-04-02 20:45:04

Hi3516开发板操作系统鸿蒙

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-04-20 20:28:40

HDF 驱动框架鸿蒙操作系统

2022-04-15 14:31:02

鸿蒙操作系统

2022-05-18 23:42:08

网络安全安全分析工具

2022-04-24 16:00:03

Ability鸿蒙

2021-12-14 10:16:00

2022-05-11 15:08:52

驱动开发系统移植

2022-05-24 15:55:37

避障小车华为

2022-04-07 14:33:31

操作系统鸿蒙HarmonyOS

2022-05-05 12:03:08

分布式系统设计

2022-03-22 15:04:20

中间件分布式软件鸿蒙

2022-05-20 14:54:33

数据安全数字化转型企业

2022-05-11 14:48:33

腾讯云寿险民生保险

2022-03-28 15:28:42

分布式软总线通讯Harmony

2022-04-01 15:18:04

HarmonyHDF 驱动鸿蒙

2022-04-14 10:24:27

分布式系统性能

2022-05-19 15:59:23

组件焦点鸿蒙

2022-05-11 13:55:18

高可用性分布式弹性

2022-04-15 14:57:57

Flex布局鸿蒙操作系统

同话题下的热门内容

DAYU200最新烧录OpenHarmony系统教程基于搭载OpenHarmony避障小车连接华为云心得体会OpenHarmony3.2的编译烧录OpenHarmony - ArkUI(ETS) 自定义图片查看组件OpenHarmony3.1-WIFI子系统之STA模式源码解析OpenHarmony之 eTS DataAbility 的使用及数据管理OpenHarmony之 网络管理 Socket 模块的使用HarmonyOs - ArkUI(JS)画布组件Canvas之自定义柱状图

编辑推荐

HarmonyOS 2.0鸿蒙第二期开发者Beta公测申请指南HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》鸿蒙HarmonyOS分布式软总线:构建低时延、高带宽的多设备虚拟网络华为HarmonyOS的强势突围: 直面物联网迷宫的蓄力进击鸿蒙HarmonyOS2.0发布会现场回忆录
我收藏的内容
点赞
收藏

51CTO技术栈公众号