CH11-HarmonyOS网络与多线程

文章目录

  • 前言
  • 目标
  • Http接口调用
    • HttpRequestOptions
    • 发起请求
    • HttpResponse
  • 数据上传和下载
    • DownloadConfig
    • 数据上传和下载
    • 示例代码
  • WebSocket概念
    • 操作步骤
    • 连接
    • 打开并发送
    • 接受消息并关闭
  • 多线程概念
    • 线程的作用
    • HarmonyOS中线程的实现
    • 同步派发syncDispatch
    • 异步派发asyncDispatch
  • 本章总结

前言

  • 随着移动互联网的发展,人们越来越依赖手机上的浏览器,或者是具备网络访问功能的App获取资源
  • 如淘宝,美团等通过移动端应用获取服务器上的商品信息和生活信息。因此具备网络交互能力的HarmonyOS APP是目前HarmonyOS应用市场的主力军。

目标

  • 通过本章的学习,您能够掌握App开发常用的一些``网络通信技术,主要包括如何使用多线程完成异步操作、如何调用Http接口实现网页内容获取、如何实现文件上传和下载操作、如何运用WebSocket协议与服务器进行交互`。

Http接口调用

  • 访问网页内容,最简单的就是http接口调用模式,这也是和浏览器访问网络资源采用的方法一致。使用该接口访问数据的步骤如下:
  1. 引入依赖

    import http from '@ohos.net.http';
    
  2. 创建HttpRequest对象:该对象里面包括发起请求中断请求订阅/取消订阅HttpResponse Header 事件。

    • 每一个HttpRequest对象对应一个Http请求。如需发起多个Http请求,须为每个Http请求创建对应HttpRequest对象。
    let httpRequest = http.createHttp();
    

HttpRequestOptions

  1. 设置请求报文参数HttpRequestOptions

20220126182354

RequestMethod
20220126182501

发起请求

  1. 发起http请求:根据URL地址和相关配置项,发起Http网络请求,使用callback方式作为异步方法。

    request(url: string, options: HttpRequestOptions, callback: AsyncCallback<HttpResponse>): void
    

20220126182706

HttpResponse

  1. 返回结果HttpResponse:request方法回调函数的返回值类型

20220126182750

示例

httpRequest.request(
    "http://news.whu.edu.cn/info/1015/65428.htm",
    { method: 'POST', // 可选,默认为“GET”
     header: {
         'Content-Type': 'application/json'
     },
     extraData: "data to post",
     readTimeout: 60000, connectTimeout: 60000 },(err, data) => {
         if (!err) {
             console.info('Result:' + data.result);
         } else {
             console.info('error:' + err.code);
         }});

数据上传和下载

  • 移动应用中通常会遇到从指定位置上传或下载文字,图片及视频等。上传和下载的特点是他们的操作方向基本是相反的,但调用的函数基本一致。下载任务操作步骤如下:
  1. 引入依赖

  2. 开启下载任务

    import request from '@ohos.request';
    download(config: DownloadConfig, callback: AsyncCallback<DownloadTask>): void
    

20220126183222

DownloadConfig

20220126183251

数据上传和下载

  1. 订阅下载进度
    on(type: ‘progress’, callback: (receivedSize: number, totalSize: number) => void): void;
    20220126183418

示例代码

import request from '@ohos.request';
export default {
    data:{downloadTask:{}},
    onInit() {
        request.download({ url: 
                          'http://news.whu.edu.cn/__local/6/77/0C/D9A3FB6FB41B582886E94D06F63_B82B59FD_34A0
                          0.jpeg' }, (err, data) => {
                          if (err) {
            console.error('Failed to request the download. Cause: ' + JSON.stringify(err));
            return;
        }
        this.downloadTask = data;
    });
    this.downloadTask.on('progress',(upsize, totalsize) =>{
        console.log('download image size'+upsize)
    });
}
}

WebSocket概念

  • WebSocketHTML5规范提出的一种协议,也是基于TCP协议的,和应用层Http协议是并存的两种协议。HTML5 Web Sockets规范定义了Web Sockets API,支持页面使用Web Socket协议与远程主机进行全双工的通信。
    20220126183647

操作步骤

  • 可以在JS中使用WebSocket建立服务器与客户端的双向连接,需要先通过createWebSocket方法创建WebSocket对象,然后通过connect方法连接到服务器。当连接成功后,客户端会收到open事件的回调,之后客户端就可以通过send方法与服务器进行通信。当服务器发信息给客户端时,客户端会收到message事件的回调。当客户端不要此连接时,可以通过调用close方法主动断开连接,之后客户端会收到close事件的回调

连接

ws.connect(defaultIpAddress, (err, value) => {
    if (!err) {
        console.log("connect success");
    } else {
        console.log("connect fail, err:" + JSON.stringify(err));
    }
});

打开并发送

import webSocket from '@ohos.net.webSocket';
var defaultIpAddress = "ws://10.211.55.4:8443/v1";
let ws = webSocket.createWebSocket();
ws.on('open', (err, value) => {
    console.log("on open, status:" + value.status + ", message:" + value.message);
    // 当收到on('open')事件时,可以通过send()方法与服务器进行通信
    ws.send("Hello, server!", (err, value) => {
        if (!err) {
            console.log("send success");
        } else {
            console.log("send fail, err:" + JSON.stringify(err));
        }
    });
});

接受消息并关闭

ws.on('message', (err, value) => {
    console.log("on message, message:" + value);
    // 当收到服务器的`bye`消息时(此消息字段仅为示意,具体字段需要与服务器协商),主动断开连接
    if (value === 'bye') {
        ws.close((err, value) => {
            if (!err) {
                console.log("close success");
            } else {
                console.log("close fail, err is " + JSON.stringify(err));
            }
        });
    }
});

多线程概念

  • 进程是具有一定独立功能的程序在某个数据集合上的一次运行活动,进程是操作系统进行资源分配和调度(CPU,内存和I/O)的一个独立单位。
    • 线程是进程的一部分,是CPU调度和分派的基本单位一个进程可以拥有多个线程,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一些在运行中必不可少的CPU资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源(除了CPU之外的其他资源,如内存和I/O)。

线程的作用

  • 在启动应用时,系统会为该应用创建一个称为“主线程”的执行线程。
    • 该线程随着应用创建或消失,是应用的核心线程。UI界面的显示和更新等操作,都是在主线程上进行
    • 主线程又称UI线程,默认情况下,所有的操作都是在主线程上执行。如果需要执行比较耗时的任务(如下载文件、查询数据库),可创建其他线程来处理

HarmonyOS中线程的实现

  • TaskDispatcher是一个任务分发器,它是Ability分发任务的基本接口,隐藏任务所在线程的实现细节

  • TaskDispatcher具有多种实现,每种实现对应不同的任务分发器。在分发任务时可以指定任务的优先级,由同一个任务分发器分发出的任务具有相同的优先级。系统提供的任务分发器有GlobalTaskDispatcher、ParallelTaskDispatcher、SerialTaskDispatcher、SpecTaskDispatcher。

    • GlobalTaskDispatcher:全局并发任务分发器,由Ability执行getGlobalTaskDispatcher()获取适用于任务之间没有联系的情况。一个应用只有一个GlobalTaskDispatcher,它在程序结束时才被销毁。

    • ParallelTaskDispatcher:并发任务分发器,由Ability执行createParallelTaskDispatcher()创建并返回。ParallelTaskDispatcher不具有全局唯一性,可以创建多个。开发者在创建或销毁dispatcher时,需要持有对应的对象引用

    • SerialTaskDispatcher:串行任务分发器,由Ability执行createSerialTaskDispatcher()创建并返回。由该分发器分发的所有的任务都是按顺序执行,但是执行这些任务的线程并不是固定的

    • SpecTaskDispatcher:专有任务分发器,绑定到专有线程上的任务分发器。目前已有的专有线程为UI线程,通过UITaskDispatcher进行任务分发。UITaskDispatcher是绑定到应用主线程的专有任务分发器, 由Ability执行getUITaskDispatcher()创建并返回。由该分发器分发的所有的任务都是在主线程上按顺序执行,它在应用程序结束时被销毁

同步派发syncDispatch

  • 对同步syncDispatch来说,主线程派发任务并在当前线程等待任务执行完成。在返回前,当前线程会被阻塞。

    TaskDispatcher globalTaskDispatcher = 
        getGlobalTaskDispatcher(TaskPriority.DEFAULT);
    globalTaskDispatcher.syncDispatch(new Runnable() {
                                      @Override
                                      public void run() {
        HiLog.info(LABEL_LOG, "sync task1 run");
    }});
    HiLog.info(LABEL_LOG, "after sync task1");
    globalTaskDispatcher.syncDispatch(new Runnable() {
                                      @Override
                                      public void run() {
        HiLog.info(LABEL_LOG, "sync task2 run");
    }});
    HiLog.info(LABEL_LOG, "after sync task2");
    

20220126185706

异步派发asyncDispatch

  • 对异步asyncDispatch来说,主线程派发任务后立即返回,返回值是一个可用于取消任务的接口Revocable。

    TaskDispatcher globalTaskDispatcher = 
        getGlobalTaskDispatcher(TaskPriority.DEFAULT);
    Revocable revocable = globalTaskDispatcher.asyncDispatch(new Runnable() {
                                                             @Override
                                                             public void run() {
        HiLog.info(LABEL_LOG, "async task1 run");
    }});
    HiLog.info(LABEL_LOG, "after async task1");
    Revocable revocable2 = globalTaskDispatcher.asyncDispatch(new Runnable() {
                                                              @Override
                                                              public void run() {
        HiLog.info(LABEL_LOG, "async task2 run");
    }});
    HiLog.info(LABEL_LOG, "after async task2");
    

    20220126185751

本章总结

  • 介绍了HarmonyOS系统中几种常用的网络数据访问方法,包括调用httpRequest对象来进行网页访问,调用requst对象来进行数据上传和下载,调用webSocket对象进行网络通信。
  • 由于网络访问受限于网络质量而较耗时,因此一般把网络访问放在单独的线程中执行,因此接着介绍了HarmonyOS系统中的多线程概念分类使用方法

HiLog.info(LABEL_LOG, “after async task2”);


[外链图片转存中...(img-reaqLVR3-1643194987978)]









# 本章总结

* 介绍了HarmonyOS系统中几种`常用的网络数据访问方法`,包括`调用httpRequest对象`来进行网页访问,`调用requst对象`来进行数据上传和下载,`调用webSocket对象`进行网络通信。
* 由于网络访问受限于网络质量而较耗时,因此一般把网络访问放在单独的线程中执行,因此接着介绍了HarmonyOS系统中的`多线程概念`,`分类`和`使用方法`

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CH341是一种常用的USB转I2C/SPI串口芯片,而LabVIEW是一种图形化编程环境。CH341-I2C LabVIEW是指使用CH341芯片与LabVIEW进行I2C通信的方式。 通过CH341芯片,我们可以将计算机的USB接口转换为I2C接口,从而实现计算机与I2C设备之间的通信。而LabVIEW作为一种强大的开发工具,可以实现可视化编程,方便地进行I2C通信的程序设计与开发。 在使用CH341-I2C LabVIEW进行开发时,首先需要连接CH341芯片和目标I2C设备。通过LabVIEW的图形化界面,我们可以直观地选择和配置CH341芯片的参数和功能。例如,我们可以设置I2C总线的速度和地址,以及是否启用ACK(应答)功能等等。 接下来,我们可以使用LabVIEW的图形化编程方法来编写I2C通信的代码。LabVIEW提供了一系列的I2C功能模块,例如发送数据、接收数据、读取寄存器等等,我们只需通过拖拽和连接这些模块,即可完成I2C通信的程序设计。而且,LabVIEW还提供了丰富的调试和测试工具,方便我们验证和优化程序的运行。 最后,我们可以通过LabVIEW将编写好的程序下载到CH341芯片,从而实现计算机和目标I2C设备之间的通信。通过LabVIEW的图形化界面,我们可以监视和分析I2C通信的数据,方便我们进行故障排查和问题解决。 总之,CH341-I2C LabVIEW是一种利用CH341芯片与LabVIEW进行I2C通信的方式,通过图形化界面和可视化编程,方便快捷地进行I2C通信的程序设计和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绿洲213

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值