HarmonyOS鸿蒙Next应用开发数据交互-使用指定网络访问数据

HarmonyOS鸿蒙Next应用开发数据交互-使用指定网络访问数据 通过学习官方案例NetworkManagement,对Harmony使用指定网络访问数据有了一定了解,和大家简单分享。

相关接口:

类名 接口名 功能描述
NetSpecifier Builder() 创建一个指定网络实例。
NetManager setupSpecificNet(NetSpecifier netSpecifier, NetStatusCallback callback) 建立指定的数据网络。
NetManager removeNetStatusCallback(NetStatusCallback callback) 停止获取数据网络状态。
NetManager getInstance(Context context) 获取网络管理的实例对象。
NetManager hasDefaultNet() 查询当前是否有默认可用的数据网络。
NetManager getDefaultNet() 获取当前默认的数据网络句柄。
NetManager addDefaultNetStatusCallback(NetStatusCallback callback) 获取当前默认的数据网络状态变化。
NetManager setAppNet(NetHandle netHandle) 应用绑定该数据网络。
NetHandle openConnection(URL url, java.net.Proxy proxy) throws IOException 使用该网络打开一个URL链接。

数据访问步骤:

  1. 使用NetManager对象获取网路实例和网络状态
  2. 利用NetManager对象获取NetHandle对象
  3. 使用NetHandle对象指明连接代理和url,用URLConnection对象接收
  4. connection = (HttpURLConnection) urlConnection
  5. 使用connection指定连接方式,并进行连接
  6. 获取数据,urlConnection.getInputStream()
  7. 输出数据,outputStream.toByteArray()

关键代码

public class NetRequestSlice extends AbilitySlice {
    private static final String TAG = NetRequestSlice.class.getSimpleName();
    private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);
    private long rx;
    private long tx;
    private Text inputText;
    private Text outText;
    private NetManager netManager;
    private Text statisticsText;

    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_net_request_slice);
        initComponents();
    }

    /**
     * 初始化组件
     */
    private void initComponents() {
        Component startButton = findComponentById(ResourceTable.Id_start_button);
        inputText = (Text) findComponentById(ResourceTable.Id_input_text);
        outText = (Text) findComponentById(ResourceTable.Id_out_text);
        statisticsText = (Text) findComponentById(ResourceTable.Id_statistics_text);
        startButton.setClickedListener(this::netRequest);
    }

    /**
     * 1 使用NetManager对象获取网路实例和网络状态
     * 2 利用NetManager对象获取NetHandle对象
     * 3 使用NetHandle对象指明连接代理和url,用URLConnection对象接收
     * 4 connection = (HttpURLConnection) urlConnection
     * 5 使用connection指定连接方式,并进行连接
     * 6 获取数据,urlConnection.getInputStream()
     * 7 输出数据,outputStream.toByteArray()
     * @param component
     */
    private void netRequest(Component component) {
        // 创建一个指定网络实例。
        netManager = NetManager.getInstance(null);
        // 检查网络是否激活
        if (!netManager.hasDefaultNet()) {
            return;
        }
        // 线程执行
        ThreadPoolUtil.submit(() -> {
            // 获取默认激活的数据网络。
            // NetHandle保存数据网络的句柄。您可以将套接字绑定到 NetHandle 实例以访问 Internet。
            NetHandle netHandle = netManager.getDefaultNet();
            // 接收默认数据网络的状态更改通知。
            netManager.addDefaultNetStatusCallback(callback);

            HttpURLConnection connection = null;
            // ByteArrayOutputStream 这个类实现了一个输出流,其中数据被写入一个字节数组。 缓冲区会随着数据写入而自动增长。可以使用 toByteArray() 和 toString() 检索数据。
            try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
                // 请求的URL
                String urlString = inputText.getText();
                URL url = new URL(urlString);
                // 使用指定的代理访问 URL。
                // java.net.Proxy.NO_PROXY 代表 DIRECT 连接的代理设置,基本上告诉协议处理程序不要使用任何代理
                URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY);
                if (urlConnection instanceof HttpURLConnection) {
                    connection = (HttpURLConnection) urlConnection;
                }
                connection.setRequestMethod("GET");
                connection.connect();
                trafficDataStatistics(false);
                try (InputStream inputStream = urlConnection.getInputStream()) {
                    byte[] cache = new byte[2 * 1024];
                    int len = inputStream.read(cache);
                    while (len != -1) {
                        outputStream.write(cache, 0, len);
                        len = inputStream.read(cache);
                    }
                } catch (IOException e) {
                    HiLog.error(LABEL_LOG, "%{public}s", "netRequest inner IOException");
                }
                String result = new String(outputStream.toByteArray());
                getUITaskDispatcher().asyncDispatch(() -> outText.setText(result));
                trafficDataStatistics(true);
                HttpResponseCache.getInstalled().flush();
            } catch (IOException e) {
                HiLog.error(LABEL_LOG, "%{public}s", "netRequest IOException");
            }
        });
    }

    private final NetStatusCallback callback = new NetStatusCallback() {
        @Override
        public void onAvailable(NetHandle handle) {
            HiLog.info(LABEL_LOG, "%{public}s", "NetStatusCallback onAvailable");
        }

        @Override
        public void onBlockedStatusChanged(NetHandle handle, boolean blocked) {
            HiLog.info(LABEL_LOG, "%{public}s", "NetStatusCallback onBlockedStatusChanged");
        }
    };

    private void trafficDataStatistics(boolean isStart) {
        int uid = 0;
        try {
            uid = getBundleManager().getUidByBundleName(getBundleName(), 0);
        } catch (RemoteException e) {
            HiLog.error(LABEL_LOG, "%{public}s", "trafficDataStatistics RemoteException");
        }
        if (isStart) {
            rx = DataFlowStatistics.getUidRxBytes(uid);
            tx = DataFlowStatistics.getUidTxBytes(uid);
        } else {
            rx = DataFlowStatistics.getUidRxBytes(uid) - rx;
            tx = DataFlowStatistics.getUidTxBytes(uid) - tx;
            getUITaskDispatcher().asyncDispatch(() -> statisticsText.setText(
                "TrafficDataStatistics:" + System.lineSeparator() +
                "Uplink traffic:" + rx + System.lineSeparator() +
                "Downstream traffic:" + tx));
        }
    }
}

效果如下图所示

图片1.png

图片2.png

完整代码地址:

完整代码地址

7 回复

很全很细很喜欢,点赞

更多关于HarmonyOS鸿蒙Next应用开发数据交互-使用指定网络访问数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


学无止境,多看楼主文章,能学到不少

再看一遍这篇文章,有助于加深理解

大佬文章如此优秀,过来支持一下!

好文章写的真不错、学习收藏了

这种分享经验的帖子是一定要支持的

在HarmonyOS鸿蒙Next应用开发中,若需通过指定网络访问数据,可按以下步骤操作:

  1. 网络权限配置:在config.json中添加ohos.permission.INTERNET权限,确保应用具备网络访问能力。

  2. 网络管理模块:通过@ohos.net.connection模块,使用getNetCapabilities()获取当前网络能力,利用request()方法指定网络类型(如Wi-Fi或蜂窝数据)进行连接。

  3. 数据请求:使用@ohos.net.http模块发起HTTP请求,通过createHttp()创建实例,request()方法发送请求并处理响应数据。

  4. 网络切换处理:监听网络状态变化,确保在网络类型切换时应用能自动适应并保持数据交互的连续性。

通过以上步骤,可实现应用在指定网络下的高效数据交互。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!