• #2020征文手机# 快速搭建一款鸿蒙分布式分歧终端机原型


    目录:

    鸿蒙分布式分歧终端机原型的设计

    1. 分歧终端机交互模块(FA)

    2. 分歧终端机核心计算模块(PA)

    3. 交互模块与计算模块的数据通信

    4. 组装和测试

    5. 关于界面美化

    6.开源代码

    子曾经曰过,有鸿蒙,一切皆有可能。

    世界上之所以战火不断

    冲突加剧

    根源就是

    分歧得不到公正的裁决

    我们小时候都玩过一种游戏

    锤子剪刀布

    其实那是一种解决分歧

    最原始最有效的方法

    可是为什么我们长大了以后

    就不用这种方法了呢?

    因为他有两个弊端

    一个是出手的快慢

    另一个就是临时变换手型

    分歧终端机的问世

    一举解决了这个难题

    那么,问题来了

    这么好的一个跨时代的产品

    为什么没有得到推广呢?

    因为它有两个弊端:

    一个是不方便携带

    另一个是……贵(划掉)……不开源

    开源的鸿蒙分布式分歧终端机的问世

    一举解决了这个问题

    那么,构建这样一款鸿蒙分布式分歧终端机原型,需要多长时间呢?

    10分钟?

    不,

    大概要……

    一个周末吧。

    具体需要三个步骤:

    第一步,先把家里的娃哄好
    第二步,打开电脑写 Bug(划掉)代码
    第三步,调试,如果有问题,重复第二步

    万事开头难,第一步永远是最难的。

    处理好了第一步以后,后两步就简单了,我们来具体分析一下鸿蒙分布式分歧终端机原型的设计原理。

    鸿蒙分布式分歧终端机原型的设计

    首先,需求分析

    1). 可以输入各自的决策
    2). 由中立第三方进行裁决
    3). 可以查看最终的裁决结果

    其次,模块划分。

    根据需求,利用鸿蒙的分布式设计思想,我们将分歧终端机分为两个核心模块:

    1). 分歧终端机的交互模块,简称FA,用于输入决策和查看结果
    2). 分歧终端机的计算模块,简称PA,作为中立第三方,做出最终裁决

    再次,流程。

    假定有A和B两人发生分歧,需要解决分歧,那么分歧解决的一个典型流程可以这样子:

    1). A 启动分歧终端机的交互模块(FA-A)
    2). B 启动分歧终端机的交互模块(FA-B)
    3). A 和 B 都连接到同一个分歧终端机计算模块,假定是计算模块A(PA-A)
    4). A 和 B 在各自的分歧终端机的交互模块上输入他和她的决策(INPUT-A,INPUT-B)

    5). 分歧终端机的计算模块自动根据 A 和 B 的输入,计算出结果:RESULT

    6). A 和 B 在各自分歧终端机的交互模块上查看结果RESULT,假如B对结果不满意,可以进行再次裁决,直到她满意为止。

    再次,详细设计。

    1. 分歧终端机交互模块(FA)

    交互模块需要向使用者提供输入接口和显示界面,所以使用的是鸿蒙的FA,也就是 Feature Ability。

    FA 也叫Page Ability,而一个Page可以有多个Ability Slice(能力切片),也就是子页面:

    根据决策过程的不同阶段,我们利用Ability Slice设计3个子页面,分别是:

    • 1). 初始准备页面,HomeSlice,用于连接分歧终端机计算模块(PA)

    这里,我们会需要用到鸿蒙分布式软总线的

    a). 设备自动发现能力

    对于在同一个网络下的鸿蒙设备,在满足条件的情况下,可以自动互相发现,不需要调用网络接口(udp/tcp等),也不需要针对不同的网络状况(wifi/蓝牙/nfc等) 做不同的实现。

    b). 设备直连能力

    通过connectAbility接口,可以直接连接需要连接的计算模块,不要知道其所在设备的实际网络情况。

    • 2). 等待页面,WaitingSlice,先加入分歧解决的人,需要在这个页面上等待其他人加入。

    当发现所有人都已经加入后,就自动进入下一个页面,也就是“分歧决策页面”。

    • 3). 决策页面,GameSlice,参与分歧解决的人在这个页面上输入自己的决策,并查看最终的裁决结果。

    本模块的技术要点:

    1). 子页面之间的切换:使用present方法
    2). 决策结果的刷新:可以用计时器来轮询结果,并刷新。

    注意

    在计时器中刷新UI时,相关代码需要运行在UI线程上,可以使用EventRunner,参考代码:

    public void runInMainThread(Runnable task){
    EventRunner runner = EventRunner.getMainEventRunner();
    EventHandler handler = new EventHandler(runner);
    handler.postTask(task);
    }

    private void startGameLoop(){
    if(gameTimer == null){
    gameTimer = new IntervalTimer(1000, 1000) {
    @Override
    public void onInterval(long l) {
    runInMainThread(new Runnable() {
    @Override
    public void run() {
    onLoop(l);
    }
    });
    }

          @Override
          public void onFinish() {
              gameTimer.schedule();
          }
      };
      gameTimer.schedule();
    

    }
    }

    private void stopGameLoop(){
    if(gameTimer != null){
    gameTimer.cancel();
    gameTimer = null;
    }
    }

    参考文档

    1). Page Ability 开发指南
    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-page-concept-0000000000033573

    2). JAVA UI 框架开发指南
    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-java-overview-0000000000500404

    2. 分歧终端机核心计算模块(PA)

    计算模块的核心任务是进行数据处理,而不需要显示,所以用到的是鸿蒙的PA,也就是Particle Ability。

    计算模块需要实现的功能是:

    a). 收集来自交互模块的决策输入
    b). 根据各自的决策来做出最终裁决

    决策过程,基本上就是一个判断 a > b 的过程,就不赘述了。

    技术要点

    1). 连接PA时,使用connectAbility
    2). 可能会有多线程数据同步的问题
    3). 要进行跨设备操作,需要在代码里,手动申请必要的权限

    在项目模块的 config.json:

    "reqPermissions": [
    {
    "name": "ohos.permission.DISTRIBUTED_DATASYNC"
    },
    {
    "name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
    },
    {
    "name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
    },
    {
    "name": "ohos.permission.GET_BUNDLE_INFO"
    },
    {
    "name": "ohos.permission.servicebus.ACCESS_SERVICE"
    },
    {
    "name": "ohos.permission.servicebus.DISTRIBUTED_DEVICE_STATE_CHANGE"
    },
    {
    "name": "ohos.permission.servicebus.GET_BUNDLE_INFO"
    }
    ],

    在MainAbility启动时申请权限:

    public class MainAbility extends Ability {
    private static final String TAG = MainAbility.class.getSimpleName();

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setMainRoute(HomeSlice.class.getName());
    
        GameClient.getInstance().init();
    
        requestPermissionsFromUser(
                new String[]{
                        "ohos.permission.DISTRIBUTED_DATASYNC",
                        "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO",
                        "ohos.permission.servicebus.ACCESS_SERVICE"
                }, 0);
    
    }
    

    }

    参考文档

    1). Service Ability 开发指南
    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-service-concept-0000000000044457

    2). 分布式任务调度
    https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ability-distributed-overview-0000001050419345

    3. 交互模块与计算模块的数据通信

    既然是两个模块之间要做交互,那么必然就涉及到数据通信。

    数据通信过程中,除了调用相关的通信接口以外,另一个很重要的点就是要对数据进行封包和解包。

    整个通信过程,是通过鸿蒙分布式软总线来完成的。

    查看更多章节

    作者:IT男阿斌

    想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区https://harmonyos.51cto.com

  • 相关阅读:
    socket based————转帖
    罗马假日 java程序员
    java六大必须理解的问题来自网络少许有误 java程序员
    spring的scope="prototype" java程序员
    @GeneratedValue java程序员
    myeclipse乱码和tomcat相关的 java程序员
    关于***.hbm.xml的说明 java程序员
    hibernate中的Annotation补充 java程序员
    爱的随笔C语言版 java程序员
    Hibernate对jpa annotation的支持 java程序员
  • 原文地址:https://www.cnblogs.com/HarmonyOS/p/14178220.html
Copyright © 2020-2023  润新知