鸿蒙(HarmonyOS)实战开发篇——基于connection的网络连接管理能力

往期知识点整理

场景描述

网络连接管理提供管理网络一些基础能力,包括获取默认激活的数据网络、获取所有激活数据网络列表、开启关闭飞行模式、获取网络能力信息等功能。

场景一:应用内部获取当前使用网络类型为wifi / 移动数据 及当前网络可连接状态做业务处理

场景二:应用侧需要知道用户当前连接网络状态并作对应的业务处理,如网络断开返回弹框提示、应用中是否按缓存数据展示图片等

场景三:获取当前连接网卡链路地址、DNS地址等信息判断处理用户连接网络位置等应用侧能力

方案描述

场景一:

应用内部获取当前使用网络类型为wifi / 移动数据 及当前网络可连接状态做业务处理

效果图

核心代码

connection.getDefaultNet().then((netHandle: connection.NetHandle) => {

connection.getNetCapabilities(netHandle).then((data: connection.NetCapabilities) => {

console.log(JSON.stringify(data));

})

});

场景二:

应用侧需要知道用户当前连接网络状态并作对应的业务处理,如网络断开返回弹框提示、应用中是否按缓存数据展示图片等

效果图

以wifi切换为例监听成功返回日志,可参考打印日志如图

方案

调用connection模块能力,使用前需要调用register开启监听,监听结束后需要调用unregister关闭当前监听请求,

核心代码

//网络状态监听

netCon : connection.NetConnection = connection.createNetConnection();

connTest(){

//开启监听事件

this.netCon.register((error: BusinessError) => {

console.log(JSON.stringify(error));

});

//监听网络是否可用

this.netCon.on('netAvailable', (data) => {

console.log("1---- net status netAvailable" + JSON.stringify(data))

})

//网络切换监听

this.netCon.on('netCapabilitiesChange', (data: connection.NetCapabilityInfo) => {

console.log(JSON.stringify(data));

});

//网络丢失()

this.netCon.on("netLost",(data) => {

console.log("1---- net lost" + JSON.stringify(data))

})

//网络不可用()

this.netCon.on('netUnavailable', (data) => {

console.log("1---- net status netUnavailable" + JSON.stringify(data))

})

//取消监听

this.netCon.unregister((error: BusinessError) => {

console.log(JSON.stringify(error));

});

}

场景三:

获取当前连接网卡链路地址、DNS地址等信息判断处理用户连接网络位置等应用侧能力

效果图

方案

步骤:1、如需要获取蜂窝网络信息,创建时需要添加关注

2、调用getConnectionProperties能力获取连接信息

核心代码

//1、 指定蜂窝网络类型获取

// 关注蜂窝网络,需要传入相关网络特征,

let netConnectionCellular = netConn.createNetConnection({

netCapabilities: {

bearerTypes: [connection.NetBearType.BEARER_CELLULAR]

}

});

try {

const ipAddresses: string[] = []; // 使用数组来收集IP地址

// 获取所有网络句柄

const allNets = connection.getAllNets();

for (const net of allNets) { // 使用for...of循环

// 获取当前网络句柄的能力信息

const netCap = connection.getConnectionProperties(net);

if (!netCap.interfaceName.includes('wlan') && Array.isArray(netCap.dnses)) {

// 确保netCap.dnses是一个数组,然后提取IP地址并添加到数组中

const dnsAddresses = netCap.dnses.map(NetAddress => NetAddress.address);

ipAddresses.push(...dnsAddresses);

}

}

// 将IP地址数组转换为逗号分隔的字符串并返回

return ipAddresses.join(',').toString();

} catch (error) {

// 打印错误并抛出,或进行其他错误处理

console.error('获取IP列表时出错:', error);

// 抛出包含原始错误信息的错误

throw new Error(`获取IP列表时出错: ${error.message}`);

}

-------

//2、默认网络获取

// 关注默认网络

let netConn = connection.createNetConnection();

connection.getDefaultNet().then((netHandle: connection.NetHandle) => {

connection.getConnectionProperties(netHandle).then((data: connection.ConnectionProperties) => {

console.log(JSON.stringify(data));

})

});
HarmonyOS API Level 12 提供了多种方式进行HTTP网络请求,通常可以借助 `HttpURLConnection` 或者通过引入第三方库(如 OkHttp、Retrofit 等)实现更复杂的场景。 以下是基于 HarmonyOS 的 HTTP 请求基本流程: ### 使用 `HttpURLConnection` 这是系统原生支持的一种方式,适合轻量级的网络请求。示例如下: ```java URL url = new URL("https://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 设置请求方法 // 添加请求头(如果需要) connection.addRequestProperty("User-Agent", "HarmonyApp"); int responseCode = connection.getResponseCode(); // 获取响应码 if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); // 获取输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder result = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { // 按行读取数据 result.append(line); } System.out.println(result.toString()); // 输出结果 } ``` --- ### 第三方工具 - Retrofit 对于复杂业务需求,推荐使用 Retrofit 来简化网络请求操作。首先需添加依赖: ```gradle implementation 'com.squareup.retrofit2:retrofit:<版本号>' implementation 'com.squareup.okhttp3:okhttp:<版本号>' ``` 接着创建服务接口: ```java public interface ApiService { @GET("/data") Call<String> getData(); } // 初始化并发起请求 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .build(); ApiService apiService = retrofit.create(ApiService.class); Call<String> call = apiService.getData(); call.enqueue(new Callback<String>() { @Override public void onResponse(Call<String> call, Response<String> response) { if (response.isSuccessful()) { Log.i("TAG", "Response Body: " + response.body()); } else { Log.e("TAG", "Error Code:" + response.code()); } } @Override public void onFailure(Call<String> call, Throwable t) { Log.e("TAG", "Network Error:", t); } }); ``` --- ### 注意事项 - **权限配置**:在应用启动前记得申请访问互联网的相关权限,在 `config.json` 文件中加入 `<uses-permission name="ohos.permission.INTERNET" />`。 - **线程管理**:避免直接在网络主线程上执行耗时任务以免阻塞UI界面更新。 - **错误处理**:合理设计异常捕获机制应对可能出现的各种意外状况比如超时连接失败等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值