• 【HarmonyOS】元服务服务卡片网络开发


    【关键字】服务卡片、元服务、API6、网络请求、图片加载

    一、API6服务卡片Java代码中如何进行网络请求?

    API6服务卡片基于FormAbility,一般元服务默认工程中的FormAbility就是MainAbility。由于FormAbility是Java语言编写的,可以使okhttp进行网络请求相关的开发。

    1、添加依赖:

    首先在entry的build.gradle中添加如下依赖:

    1. dependencies {
    2. implementation 'com.squareup.okhttp3:okhttp:3.14.9'
    3. }

    Okhttp相关的使用可以参考Okhttp官网文档,链接如下:Overview - OkHttp (square.github.io)

    2、使用方法,这边以Get请求为例,说明一下Okhttp的简单用法:

    初始化OkhttpClient和request:

    1. OkHttpClient okHttpClient = new OkHttpClient();
    2. Request request = new Request.Builder()
    3. .url(url)//请求地址
    4. .get()//Get方式请求
    5. .build();

    a、同步请求:

    1. try {
    2. Response response=okHttpClient.newCall(request).execute();
    3. if(response.isSuccessful()){
    4. HiLog.info(TAG,"response success "+response.body().string());
    5. response.close();
    6. }
    7. } catch (IOException e) {
    8. throw new RuntimeException(e);
    9. }

    b、异步请求:

    1. okHttpClient.newCall(request).enqueue(new Callback() {
    2. @Override
    3. public void onFailure(Call call, IOException e) {
    4. e.printStackTrace();
    5. }
    6. @Override
    7. public void onResponse(Call call, Response response) throws IOException {
    8. try{
    9. if (response.isSuccessful()) {
    10. HiLog.info(TAG,"response success "+response.body().string());
    11. response.close();
    12. }
    13. } catch (IOException e) {
    14. throw new IOException(e);
    15. }
    16. }
    17. });

    我们通过使用okhttputils工具类库可以进一步简化请求代码:

    Okhttputils使用说明:okhttputils: 对okhttp的封装类 (gitee.com)

    依赖引用:

    1. dependencies {
    2. implementation 'io.openharmony.tpc.thirdlib:okhttputils:1.0.1'
    3. }

    同步请求:

    1. Response response = OkHttpUtils
    2. .get()//
    3. .url(url)//
    4. .tag(this)//
    5. .build()//
    6. .execute();

    异步请求:

    1. String url = "http://www.csdn.net/";
    2. OkHttpUtils
    3. .get()
    4. .url(url)
    5. .addParams("username", "hyman")
    6. .addParams("password", "123")
    7. .build()
    8. .execute(new StringCallback()
    9. {
    10. @Override
    11. public void onError(Request request, Exception e)
    12. {
    13. }
    14. @Override
    15. public void onResponse(String response)
    16. {
    17. }
    18. });

    二、如何通过网络请求数据进行服务卡片初始化?

    由于我们是FormAbility的onCreateForm中完成卡片的创建,下面以创建卡片为例,说明该如何完成网络数据创建卡片。

    如官网的示例中我们需要在onCreateForm中创建ProviderFormInfo,所以我们可以将通过网络请求获取的数据传入FormBindingData中,完成卡片的的初始化。

    cke_155682.png

    需要注意的是,在初始化卡片的时候,需要使用的Okhttp进行同步请求,请求完成后将数据传入FormBindingData,以下代码使用OkHttpUtils编写,,封装一个getData方法返回FormBindingData对象:

    1. public FormBindingData getData(){
    2. try {
    3. Response response=OkHttpUtils.get().url("url").build().execute();
    4. String str=response.body().string();
    5. HiLog.info(TAG, "onCreateForm: body "+str);
    6. response.close();
    7. return new FormBindingData(str);
    8. } catch (Exception e) {
    9. HiLog.info(TAG, "onCreateForm: Exception "+e.toString()+" "+e.getMessage());
    10. }
    11. return new FormBindingData();
    12. }

    也可以通过ZSONObject获取java bean后,创建FormBindingData对象,如下:

    1. public FormBindingData getData(){
    2. try {
    3. Response response=OkHttpUtils.get().url("url").build().execute();
    4. String str=response.body().string();
    5. HiLog.info(TAG, "onCreateForm: body "+str);
    6. response.close();
    7. HotData hotData=ZSONObject.stringToClass(str, HotData.class);//str转化为java对象
    8. ZSONObject zsonObject = new ZSONObject();
    9. zsonObject.put("data",hotData.getData());//获取对象中的字段,赋值给ZSONObject
    10. return new FormBindingData(zsonObject);//通过ZSONObject创建FormBindingData
    11. } catch (Exception e) {
    12. HiLog.info(TAG, "onCreateForm: Exception "+e.toString()+" "+e.getMessage());
    13. }
    14. return new FormBindingData();
    15. }

    创建FormBindingData后传入formInfo完成卡片初始化:

    1. ProviderFormInfo formInfo = new ProviderFormInfo();
    2. formInfo.setJsBindingData(getData());
    3. return formInfo;

    三、如何在卡片触发事件和定时定点刷新时通过网络请求刷新卡片内容?

    卡片的点击事件会在onTriggerFormEvent中触发,定时定点刷新需要在onUpdateform中完成,所有的更新卡片的操作都是通过updateForm(formId, formBindingData)方法完成的。所以,同样可以使用getData方法获取formBindingData后就可以进行卡片内容的刷新。

    四、如何加载网络图片?

    加载网络图片,官网是通过内存图片的方式进行加载的,参考链接如下:文档中心

    同样我们可以使用okhttp获取网络图片的bytes内容,然后通过formBindingData.addImageData("xxx.png", bytes)的方式进行图片内容的绑定。

    bytes数据可以用以下方法获取

    1. public byte[] getImageData(String url){
    2. byte[] bytes=null;
    3. try {
    4. Response response=OkHttpUtils.get().url(url).build().execute();
    5. if(response.isSuccessful()){
    6. if(response.body()!=null){
    7. bytes= response.body().bytes();
    8. }
    9. response.close();
    10. HiLog.info(TAG, "getImageData: success");
    11. }else{
    12. HiLog.info(TAG, "getImageData: failed");
    13. }
    14. } catch (IOException e) {
    15. throw new RuntimeException(e);
    16. }
    17. return bytes;
    18. }

    然后在onCreateForm中参考官网方法进行初始化:

    1. @Override
    2. protected ProviderFormInfo onCreateForm(Intent intent) {
    3. HiLog.info(TAG, "onCreateForm");
    4. ZSONObject zsonObject = new ZSONObject();
    5. String image="logo"+System.currentTimeMillis()+".png";
    6. HiLog.info(TAG, "onCreateForm: image=" + image);
    7. zsonObject.put("imageSrc", "memory://"+image);
    8. FormBindingData formBindingData = new FormBindingData(zsonObject);
    9. ProviderFormInfo formInfo = new ProviderFormInfo();
    10. formBindingData.addImageData(image,getImageData("url"));
    11. formInfo.setJsBindingData(formBindingData);
    12. return formInfo;
    13. }

    定时刷新和点击触发刷新同理,就不再赘述了。

  • 相关阅读:
    Android屏幕刷新机制
    XILINX MPSOC通过VPSS实现输出缩放,像素格式转换
    LiveGBS流媒体平台GB/T28181功能-服务器日志文件过大时如何关闭信令服务日志和流媒体服务相关日志如何配置
    Oracle数据库更改账号密码,设置账号有效期
    活性基团功能化PEG纳米金包Fe3O4磁纳米颗粒
    基于安卓android微信小程序的校园跑腿系统
    用CI/CD工具Vela部署Elasticsearch + C# 如何使用
    推荐一款性价比高、功能完善的资产管理系统
    小白可以做外贸独立站吗
    Day-02 从 0 开始搭建一套规范的 Vue3.x 项目工程环境
  • 原文地址:https://blog.csdn.net/Mayism123/article/details/133741180