订阅网络状态变化
网络状态主要包含:
- 连接状态(是否成功连接网络)
- 网络类型(蜂窝网络、Wi-Fi网络、蓝牙网络、以太网网络、VPN网络)
- 网络拥堵
- 信号强度
- 网络速度
- ...
上述任一指标变化均可视为网络状态的改变
创建网络对象
typescript
connection.createNetConnection(netSpecifier?:NetSpecifier,timeout?:number):NetConnection//创建网络对象
参数说明:
- netSpecifier: 可选,NetSpecifier类型,指定网络的各项特征
- timeout:可选,获取netSpecifier指定网络时的超时时间
NetSpecifier参数说明: netCapabilities:必填,NetCapabilities类型,存储数据网络的传输能力和承载类型,即网络能力集 bearerPrivateldentifier:可选,string类型,网络标识符,如Wi-Fi网络标识符为"wifi"
NetCapabilities参数说明: linkUpBandwidthKbps:可选,string类型,上行(设备到网络)带宽 linkDownBandwidthKbps:可选,string类型,下行(网络到设备)带宽 networkCap:可选,Array类型,网络具体能力,如网络流量是否被计费、网络是否具有访问Internet的能力等 bearerTypes:必填,Array类型,网络类型
NetBearType 网络类型参数说明:
示例代码:
typescript
//关注默认网络
let netConnection=connection.createNetConnection()
//关注蜂窝网络
let netConnection=connection.createNetConnection({
netCapabilities:{
bearerTypes:[connection.NetBearType.BEARER_CELLULAR]
}
},0)
获取默认激活网络及其能力
typescript
connection.getDefaultNet().then((netHandle:connection.NetHandle)=>{
//获取默认激活网络
if(netHandle.netId===0){
//当前无默认网络时,获取的netHandler的netid为0
return
}
connection.getNetCapabilities(netHandle,(error:BusinessError,data:connection.NetCapabilities)=>{});//获取网络能力
})
可订阅事件
typescript
netConnection.on('事件类型',()=>{})
-
netAvailable 网络可用事件:当设备连接到可用网络时触发
-
netBlockStatusChange 网络阻塞状态事件:当建立网络连接超时、传输数据包丢失或网络带宽不足、负载过高时触发
-
netCapabilitiesChange 网络能力变化事件:当网络能力(如类型、带宽等)发生变化时触发
-
netConnectionPropertiesChange 网络连接信息变化事件:当网络连接的信息(如IP地址、网关等)发生变化时触发
-
netLost 网络丢失事件:当设备失去网络连接时触发
-
netUnavailable 网络不可用事件:当设备处于网络状态或网络不可用时触发
常见事件订阅场景如下
使用RCP访问网络
RCP业务流程
1.创建会话
2.发起请求
- get请求
typescript
get(url:URLOrString,destination?:ResponseBodyDestination):Promise<Response>;
请求示例
typescript
let getPromise=session.get(
EXAMPLE_URL,
'array-buffer'
);
ResponseBodyDestination类型指定了响应的目标位置或目的地,指示HTTP客户端应该将响应数据发送到那个位置
该类支持的值的类型有:array-buffer、IncomingDataCallback、DownloadToFile、DownloadToStream、INetworkOutputQueue
- post请求
typescript
post(url:URLOrString,content?:RequestContent,destination?:ResponseBodyDestination):Promise<Response>;
请求示例
typescript
let postPromise=session.post(
EXAMPLE_URL,
CONTENT,
'array-buffer'
);
RequestContent是HTTP模块中的一种类型,代表HTTP请求的内容。例如,登录功能中的用户名和密码
3.处理响应
typescript
let promise=session.get(...);
promise.then((value)=>{
//value为请求的返回值
...
})
value包含:request(收到此响应的相关HTTP请求内容)、statusCode(HTTP请求的结果代码)、header(响应头)、effectiveUrl(重定向后请求的有效URL)
RCP请求开发流程
1.导入rcp模块 应用需要访问网络时,需要在module.json5文件中添加INTERNET权限,允许应用使用网络
typescript
//module.json5
"module":{
"requestPermissions":[
{
"name":"ohos.permission.INTERNET"
}
]
}
在ets文件中导入rcp模块
typescript
//RcpUtils.ets
import {rcp} from '@kit.RemoteCommunicationKit';
2.创建Session对象 定义一个类RCPUtils,实现rcp相关方法,创建session对象
typescript
//RcpUtils.ets
export class RCPUtils{
rcpSession:rcp.Session;
constructor(){
this.rcpSession=rcp.createSession();
}
}
3.发起请求、处理响应 定义一个getRCPRequest方法,通过Session对象调用get方法发起请求,传入请求资源的url
typescript
async getRCPRequest():Promise<string>{
let responseData:string='';
await this.rcpSession.get(this.url)
//处理响应保存资源
.then((res)=>{
...
responseData=...
})
.catch((err)=>{
...
})
return responseData
}
定义一个postRCPRquest方法,将请求的内容配置到requestContent字段中,传入请求资源的url和requestContent
typescript
async postRCPRequest():Promise<ListInfo[]>{
let responseData:Array<listInfo>=[];
let requestContent:rcp.RequestContent={...}
await this.rcpSession.post(this.url,requestContent)
//处理响应保存资源
.then((res)=>{
...
responseData=...
})
.catch((err)=>{
...
})
return responseData
}
4.销毁对象 当请求使用完毕时,须调用close方法主动释放与此会话关联的资源
typescript
//销毁数据请求对象
destroySession(){
this.rcpSession.close();
}
页面渲染
typescript
//Mypage.ets
@State sourceOne:string=''
@State sourceTwo:Array<ListInfo>=[]
async aboutToAppear():Promise<void>{
let rcpUtil:RCPUtils=new RCPUtils();
await rcpUtil.getRCPRequest().then((value:string)=>{
this.sourceOne=value
});
await rcpUtil.postRCPRequest().then((value:Array<ListInfo>)=>{
this.sourceTwo=value
});
rcpUtil.destroySession();
}
typescript
build(){
List(){
ForEach(this.sourceTwo,(item:ListInfo)=>{
ListItem(){
Row(){
Cloumn(){
Text(this.sourceOne)
Text(item)
}
}
}
})
}
}