[文章]HarmonyOS应用开发数据交互-使用指定网络访问数据

阅读量0
0
1
通过学习官方案例NetworkManagement,对Harmony使用指定网络访问数据有了一定了解,和大家简单分享。一、相关接口
类名
接口名
功能描述
NetSpecifier
Builder()
创建一个指定网络实例。
NetManager
setupSpecificNet(NetSpecifier netSpecifier, NetStatusCallback callback)
建立指定的数据网络。
removeNetStatusCallback(NetStatusCallback callback)
停止获取数据网络状态。
NetManager
getInstance(Context context)
获取网络管理的实例对象。
hasDefaultNet()
查询当前是否有默认可用的数据网络。
getDefaultNet()
获取当前默认的数据网络句柄。
addDefaultNetStatusCallback(NetStatusCallback callback)
获取当前默认的数据网络状态变化。
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()
二、关键代码
  1. public class NetRequestSlice extends AbilitySlice {
  2.     private static final String TAG = NetRequestSlice.class.getSimpleName();
  3.     private static final HiLogLabel LABEL_LOG = new HiLogLabel(3, 0xD000F00, TAG);
  4.     private long rx;
  5.     private long tx;
  6.     private Text inputText;
  7.     private Text outText;
  8.     private NetManager netManager;
  9.     private Text statisticsText;
  10.     @Override
  11.     public void onStart(Intent intent) {
  12.         super.onStart(intent);
  13.         super.setUIContent(ResourceTable.Layout_net_request_slice);
  14.         initComponents();
  15.     }
  16.     /**
  17.      * 初始化组件
  18.      */
  19.     private void initComponents() {
  20.         Component startButton = findComponentById(ResourceTable.Id_start_button);
  21.         inputText = (Text) findComponentById(ResourceTable.Id_input_text);
  22.         outText = (Text) findComponentById(ResourceTable.Id_out_text);
  23.         statisticsText = (Text) findComponentById(ResourceTable.Id_statistics_text);
  24.         startButton.setClickedListener(this::netRequest);
  25.     }
  26.     /**
  27.      * 1 使用NetManager对象获取网路实例和网络状态
  28.      * 2 利用NetManager对象获取NetHandle对象
  29.      * 3 使用NetHandle对象指明连接代理和url,用URLConnection对象接收
  30.      * 4 connection = (HttpURLConnection) urlConnection
  31.      * 5 使用connection指定连接方式,并进行连接
  32.      * 6 获取数据,urlConnection.getInputStream()
  33.      * 7 输出数据,outputStream.toByteArray()
  34.      * @param component
  35.      */
  36.     private void netRequest(Component component) {
  37.         //  创建一个指定网络实例。
  38.         netManager = NetManager.getInstance(null);
  39.         //  检查网络是否激活
  40.         if (!netManager.hasDefaultNet()) {
  41.             return;
  42.         }
  43.         // 线程执行
  44.         ThreadPoolUtil.submit(() -> {
  45.             // 获取默认激活的数据网络。
  46.             // NetHandle保存数据网络的句柄。您可以将套接字绑定到 NetHandle 实例以访问 Internet。
  47.             NetHandle netHandle = netManager.getDefaultNet();
  48.             //  接收默认数据网络的状态更改通知。
  49.             netManager.addDefaultNetStatusCallback(callback);
  50.             HttpURLConnection connection = null;
  51.             //  ByteArrayOutputStream 这个类实现了一个输出流,其中数据被写入一个字节数组。 缓冲区会随着数据写入而自动增长。可以使用 toByteArray() 和 toString() 检索数据。
  52.             try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
  53.                 //   请求的URL
  54.                 String urlString = inputText.getText();
  55.                 URL url = new URL(urlString);
  56.                 //  使用指定的代理访问 URL。
  57.                 //  java.net.Proxy.NO_PROXY 代表 DIRECT 连接的代理设置,基本上告诉协议处理程序不要使用任何代理
  58.                 URLConnection urlConnection = netHandle.openConnection(url, java.net.Proxy.NO_PROXY);
  59.                 if (urlConnection instanceof HttpURLConnection) {
  60.                     connection = (HttpURLConnection) urlConnection;
  61.                 }
  62.                 connection.setRequestMethod("GET");
  63.                 connection.connect();
  64.                 trafficDataStatistics(false);
  65.                 try (InputStream inputStream = urlConnection.getInputStream()) {
  66.                     byte[] cache = new byte[2 * 1024];
  67.                     int len = inputStream.read(cache);
  68.                     while (len != -1) {
  69.                         outputStream.write(cache, 0, len);
  70.                         len = inputStream.read(cache);
  71.                     }
  72.                 } catch (IOException e) {
  73.                     HiLog.error(LABEL_LOG, "%{public}s", "netRequest inner IOException");
  74.                 }
  75.                 String result = new String(outputStream.toByteArray());
  76.                 getUITaskDispatcher().asyncDispatch(() -> outText.setText(result));
  77.                 trafficDataStatistics(true);
  78.                 HttpResponseCache.getInstalled().flush();
  79.             } catch (IOException e) {
  80.                 HiLog.error(LABEL_LOG, "%{public}s", "netRequest IOException");
  81.             }
  82.         });
  83.     }
  84.     private final NetStatusCallback callback = new NetStatusCallback() {
  85.         @Override
  86.         public void onAvailable(NetHandle handle) {
  87.             HiLog.info(LABEL_LOG, "%{public}s", "NetStatusCallback onAvailable");
  88.         }
  89.         @Override
  90.         public void onBlockedStatusChanged(NetHandle handle, boolean blocked) {
  91.             HiLog.info(LABEL_LOG, "%{public}s", "NetStatusCallback onBlockedStatusChanged");
  92.         }
  93.     };
  94.     private void trafficDataStatistics(boolean isStart) {
  95.         int uid = 0;
  96.         try {
  97.             uid = getBundleManager().getUidByBundleName(getBundleName(), 0);
  98.         } catch (RemoteException e) {
  99.             HiLog.error(LABEL_LOG, "%{public}s", "trafficDataStatistics RemoteException");
  100.         }
  101.         if (isStart) {
  102.             rx = DataFlowStatistics.getUidRxBytes(uid);
  103.             tx = DataFlowStatistics.getUidTxBytes(uid);
  104.         } else {
  105.             rx = DataFlowStatistics.getUidRxBytes(uid) - rx;
  106.             tx = DataFlowStatistics.getUidTxBytes(uid) - tx;
  107.             getUITaskDispatcher().asyncDispatch(() -> statisticsText.setText(
  108.                 "TrafficDataStatistics:" + System.lineSeparator() + "Uplink traffic:" + rx + System.lineSeparator()
  109.                     + "Downstream traffic:" + tx));
  110.         }
  111.     }
  112. }
复制代码

三、效果如下图所示
   

完整代码地址:

附件:
harmony使用指定网络访问数据.docx
(121.39 KB, 下载次数: 1)

回帖

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
链接复制成功,分享给好友