【软通动力】HarmonyOS三方件开发指南(3)-AsyncHttpHarmony组件 原创 精华

软通田可辉
发布于 2021-1-12 09:42
浏览
23收藏

1.      AsyncHttpHarmony功能介绍

1.1.        组件介绍

        在做HarmonyOS开发过程中,用java原生的HttpsURLConnection实现网络请求很难高效的达到预期效果。我们需要高效的处理数据解析,更加快捷的实现UI线程更新,这里基于方网络框架AsyncHttpClient二次封装,更加高效实现网络请求及数据处理。同时HarmonyOS为我们提供了TaskDispatcher类派发同步任务,达到更新UI的效果。
1.2.   TV模拟器上运行效果

请求前:

【软通动力】HarmonyOS三方件开发指南(3)-AsyncHttpHarmony组件-鸿蒙开发者社区

点击get请求之后:

【软通动力】HarmonyOS三方件开发指南(3)-AsyncHttpHarmony组件-鸿蒙开发者社区

2.      AsyncHttpHarmony使用方法

2.1.        为应用添加httplibrary-debug.har包依赖

在应用模块中调用HAR,常用的添加依赖的方式包括如下两种。

Ø  方式一:依赖本地HAR

第一步:将httplibrary-debug.har复制到entry\libs目录下即可(由于build.gradle中已经依赖libs目录下的*.har,因此不需要再做修改)。

【软通动力】HarmonyOS三方件开发指南(3)-AsyncHttpHarmony组件-鸿蒙开发者社区

查看工程目录中build.gradle下的*.har是否存在:

【软通动力】HarmonyOS三方件开发指南(3)-AsyncHttpHarmony组件-鸿蒙开发者社区

第二步:需要添加外部依赖实现Header类的引入,引入方式如下图,引入完之后同步下即可可以使用。

【软通动力】HarmonyOS三方件开发指南(3)-AsyncHttpHarmony组件-鸿蒙开发者社区

2.2.        为应用添加网络权限,config.json文件部分代码如下:

"reqPermissions": [

  {

    "name": "ohos.permission.INTERNET",

    "reason": "",

    "usedScene": {

      "ability": [

        "com.example.ohosdemo.MainAbility",

        "com.example.ohosdemo.slice.MainAbilitySlice"

      ],

      "when": "always"

    }

  },


 

以上操作无误之后就可以进行编码了!

 

3.      AsyncHttpHarmony开发实现

3.1.        主页面的布局文件

定义一个Text文本用来显示请求返回的数据,一个text实现请求点击事件

<?xml version="1.0" encoding="utf-8"?>

<DirectionalLayout

    xmlns:ohos="http://schemas.huawei.com/res/ohos"

    ohos:height="match_parent"

    ohos:width="match_parent"

    ohos:orientation="vertical">




    <Text

        ohos:id="$+id:tvResult"

        ohos:height="match_content"

        ohos:width="match_content"

        ohos:background_element="$graphic:background_ability_main"

        ohos:layout_alignment="horizontal_center"

        ohos:text="数据显示"

        ohos:text_size="50"

        ohos:top_margin="180vp"

    />

    <Text

        ohos:id="$+id:tvRequest"

        ohos:height="match_content"

        ohos:width="match_content"

        ohos:background_element="$graphic:background_ability_main"

        ohos:layout_alignment="horizontal_center"

        ohos:text="get请求"

        ohos:text_size="50"

        ohos:top_margin="80vp"

        />




</DirectionalLayout>


3.2.        MainAbilitySlice代码如下

核心代码是initListener,其中声明了一个 AsyncHttpClient对象,设置请求参数,调用get方法获取ulr返回结果,然后通过TaskDispatcher类派发同步任务达到更新UI的效果,代码如下:

package com.huawei.asynchttpharmonyos.slice;




import com.example.httplibrary.utils.AsyncHttpClient;

import com.example.httplibrary.utils.JsonHttpResponseHandler;

import com.example.httplibrary.utils.RequestParams;

import com.huawei.asynchttpharmonyos.ResourceTable;

import cz.msebera.android.httpclient.Header;

import ohos.aafwk.ability.AbilitySlice;

import ohos.aafwk.content.Intent;

import ohos.agp.components.Component;

import ohos.agp.components.Text;

import ohos.hiviewdfx.HiLog;

import ohos.hiviewdfx.HiLogLabel;




public class MainAbilitySlice extends AbilitySlice {




    private Text tvRequest,tvResult;




    private static final String TAG = "MainAbilitySlice";




    private static final HiLogLabel label=new HiLogLabel(HiLog.DEBUG,0x00100,"async-http");

    @Override

    public void onStart(Intent intent) {

        super.onStart(intent);

        super.setUIContent(ResourceTable.Layout_ability_main);

        initView();

        initListener();

    }




    private void initView() {

        tvResult = (Text) findComponentById(ResourceTable.Id_tvResult);

        tvRequest = (Text) findComponentById(ResourceTable.Id_tvRequest);

    }




    private void initListener() {

        tvRequest.setClickedListener(new Component.ClickedListener() {

            @Override

            public void onClick(Component component) {

                String url="https://apis.juhe.cn/simpleWeather/query";

                String key="32becf485f7f174d4385957b62f28f61";
                 //这里获取AsyncHttpClient实例, 这个类提供了get post delete put 请求对外的接口方法

                    AsyncHttpClient client=new AsyncHttpClient();
 
                 //这里是我们包装参数的实体类

                    RequestParams params=new RequestParams();

                    params.put("city","西安");

                    params.put("key",key);
                 /这里是实现get请求的方,JsonHttpResponseHandler会重写请求成功的onSuccess和onFailure两个方法,两个方法内部做具体业务逻辑

                    client.get(url,params, new JsonHttpResponseHandler() {

                        @Override

                        public void onSuccess(int statusCode, Header[] headers, String responseString) {

                            super.onSuccess(statusCode, headers, responseString);

                            HiLog.error(label,"zel-onSuccess:"+responseString,responseString);

                            // 通知主线程更新UI

                             getUITaskDispatcher().asyncDispatch(new Runnable() {

                                @Override

                                public void run() {
                                 // 这里具体业务Text文本显示请求数据

                                    tvResult.setText(responseString);

                                }

                            });

                        }




                        @Override

                        public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {

                            super.onFailure(statusCode, headers, responseString, throwable);

                            HiLog.error(label,"zel-onFailure:"+responseString,responseString);

                        }

                    });




            }

        });

    }




    @Override

    public void onActive() {

        super.onActive();

    }




    @Override

    public void onForeground(Intent intent) {

        super.onForeground(intent);

    }

}


 项目源代码地址:https://github.com/isoftstone-dev/Http-Async-HarmonyOS

欢迎交流:HWIS-HOS@isoftstone.com

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-1-21 09:50:08修改
30
收藏 23
回复
举报
23条回复
按时间正序
/
按时间倒序
芒果爱学习
芒果爱学习

学习了

回复
2021-1-12 10:59:49
可可学鸿蒙
可可学鸿蒙

您好,请假下,我在完成请求获取到数据之后,不能直接setText(),为什么?

回复
2021-1-12 17:00:36
软通田可辉
软通田可辉 回复了 可可学鸿蒙
您好,请假下,我在完成请求获取到数据之后,不能直接setText(),为什么?

请求数据在子线程中获取,需要子线程通知主线程匀修改UI,欢迎有问题随时留言。

回复
2021-1-13 09:10:36
Whyalone
Whyalone

亲,做好文章排版能够获方便读者阅读,我们也在改进编辑器产品体验。感谢分享!

回复
2021-1-13 10:28:03
wx5959d8a5b11af
wx5959d8a5b11af 回复了 可可学鸿蒙
您好,请假下,我在完成请求获取到数据之后,不能直接setText(),为什么?

   // 通知主线程更新UI

                             getUITaskDispatcher().asyncDispatch(new Runnable() {

                                @Override

                                public void run() {
                                 // 这里具体业务Text文本显示请求数据

                                    tvResult.setText(responseString);

                                }

                            });

这个方法通知修改UI 

回复
2021-1-15 10:31:47
小梁学鸿蒙
小梁学鸿蒙

这个网络请求框架支持post、put请求方式不?

回复
2021-1-15 15:51:20
软通田可辉
软通田可辉 回复了 小梁学鸿蒙
这个网络请求框架支持post、put请求方式不?

支持,除了您提到的常用post、put请求方式,此外还支持patch、delete、get等请求方式。

回复
2021-1-15 17:48:51
鸿蒙张荣超
鸿蒙张荣超 回复了 软通田可辉
支持,除了您提到的常用post、put请求方式,此外还支持patch、delete、get等请求方式。

不错啊,666

回复
2021-1-15 19:33:21
软通田可辉
软通田可辉

感谢老师关注,还得继续学习

回复
2021-1-18 09:23:22
软通田可辉
软通田可辉 回复了 Whyalone
亲,做好文章排版能够获方便读者阅读,我们也在改进编辑器产品体验。感谢分享!

感谢宝贵意见,后续改进

回复
2021-1-19 09:50:05
软通田可辉
软通田可辉 回复了 wx5959d8a5b11af
// 通知主线程更新UI getUITaskDispatcher().asyncDispatch(new Runnable() { @Override public void run() { // 这里具体业务Text文本显示请求数据 tvResult.setText(responseString); } }); 这个方法通知修改UI

受教受教

回复
2021-1-19 09:50:35
芒果爱学习
芒果爱学习

学习了

回复
2021-1-19 14:37:23
软通田可辉
软通田可辉 回复了 芒果爱学习
学习了

后续还会有更多文章发布,欢迎常来,相互学习

回复
2021-1-25 09:19:09
娜子开心
娜子开心

干货满满

回复
2021-1-26 15:41:41
软通田可辉
软通田可辉 回复了 娜子开心
干货满满

感谢,欢迎常来

回复
2021-1-27 09:19:34
qq589b27528fb58
qq589b27528fb58

我想问一下如何动态将Image的图片动态设置成xml矢量图标

回复
2021-1-27 11:12:47
可粒尔
可粒尔

老师您好,想请教一下请求的时候如何发送JSON格式数据,头部数据headers又要怎么设置呢?

回复
2021-2-2 14:07:19
软通田可辉
软通田可辉 回复了 qq589b27528fb58
我想问一下如何动态将Image的图片动态设置成xml矢量图标

您好,目前不支持png转svg矢量图,谢谢!

回复
2021-2-3 09:24:42
软通田可辉
软通田可辉 回复了 可粒尔
老师您好,想请教一下请求的时候如何发送JSON格式数据,头部数据headers又要怎么设置呢?

发送json数据步骤
1:实例化JsonObject对象,给其对象放入数据。
              JsonObject jsonObject = new JsonObject();
                jsonObject.addProperty("name","name");
                jsonObject.addProperty("password","123456");
2:实例化词ByteArrayEntity对象,将json和Header添加进去。
                   entity = new ByteArrayEntity(jsonObject.toString().getBytes("UTF-8"));
                    entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

3,post请求,将包含有json和header的实体ByteArrayEntity传进去。
  client.post(MainAbilitySlice.this,url,entity,"application/json", new JsonHttpResponseHandler(){...}

3
回复
2021-2-5 09:31:12
可粒尔
可粒尔 回复了 软通田可辉
发送json数据步骤1:实例化JsonObject对象,给其对象放入数据。 JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("name","name"); jsonObject.addProperty("password","123456");2:实例化词ByteArrayEntity对象,将json和Header添加进去。 entity = new ByteArray...

太感谢了,已解决

2
回复
2021-2-5 11:20:59
回复
    相关推荐