HarmonyOS 使用服务卡片开发时,通过网络请求的数据无法加载到卡片中?

1、开发服务卡片时,已经可以使用静态数据并显示在服务卡片中。

2、在继承了FormExtensionAbility的EntryFormAbility中,分别在onAddForm和onUpdateForm方法中,使用http请求数据来替换静态数据时,由于http请求方法为异步方法,请求未响应的情况onAddForm和onUpdateForm方法都执行结束了。

3、onAddForm和onUpdateForm方法又不允许使用async+await的方式,提示异常。

4、还有什么样的方式可以对http异步请求的数据发送到卡片中。或者是能在EntryFormAbility中解决异步方法的问题?

代码示例:

onFormEvent(formId: string, message: string) {
  console.log('onFormEvent');
  // Called when a specified message event defined by the form provider is triggered.
  let params: param = {
    id: '9764',
  }
  NEW_POST('url', params).then(res => {
    console.info('onFormEvent-data', res.code, res.result, res.data.lngId, JSON.stringify(res.data));
    const jsonArray = JSON.parse(res.data) as result[];
    let obj: Record<string, string|string[]> = {
      'test': '测试2',
      'titleC': jsonArray.map((item) => item.titleC)
    };
    let formData = formBindingData.createFormBindingData(obj);
    formProvider.updateForm(formId, formData)
    console.log('onFormEvent-success');
  })
}
阅读 481
1 个回答

这里的异步请求并不会导致卡片不刷新,因为你的刷新方法是写在回调里面的。

最有可能是因为:

FormExtensionAbility进程不能常驻后台,即在卡片生命周期回调函数中无法处理长时间的任务,在生命周期调度完成后会继续存在5秒,如5秒内没有新的生命周期回调触发则进程自动退出。

针对可能需要5秒以上才能完成的业务逻辑,建议拉起主应用进行处理,处理完成后使用updateForm通知卡片进行刷新。

针对网络请求刷新卡片,这边建议拉起主应用进行处理。

相关文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-ui-widget-event-call-V5\#开发步骤

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-ui-widget-event-uiability-V5\#通过call事件刷新卡片内容

首次创建卡片的时的初始化数据,可以通过下面的方式来刷新:

首先:在card.page页面

@LocalStorageProp('formId') formId: string = "";
@LocalStorageProp('formTime') @Watch("onFormTimeChange") formTime: string = "";

/*
 * 后台拉起EntryAbility,通过updateCardInfo去刷新卡片内容
 * */
onFormTimeChange() {
  postCardAction(this, {
    action: 'call',
    abilityName: 'EntryAbility',
    params: {
      formId: this.formId,
      method: 'updateCardInfo'
    }
  });
}

然后,在formAbility里面

export class FormDataClass {
  formId: string = ""
  formTime: string = ""
  hotInfos: Array<HotItemData> = []

  constructor(formId: string) {
    this.formId = formId
  }
}

onAddForm(want: Want) {
  let formData = '';
  if (want && want.parameters) {
    let parameters = want.parameters
    let cardName = parameters["ohos.extra.param.key.form_name"]
    let cardId = parameters["ohos.extra.param.key.form_identity"] as string
    if (cardName == "sina_hot_list") {
      let formData = new FormDataClass(cardId);
      formData.formTime = systemDateTime.getTime().toString();
      let formInfo: formBindingData.FormBindingData = formBindingData.createFormBindingData(formData);
      // 执行这里之后,会触发卡片UI,通知卡片UI中的“formTime”发生了变化
      formProvider.updateForm(cardId, formInfo)
    }
  }
  return formBindingData.createFormBindingData(formData);
}

通过更新time,监听到数据变化后,回调EntryAbility,请求网络数据,再更新卡片内容。同样,该方式也可用在,onUpdateForm定时刷新中。

logo
HarmonyOS
子站问答
访问
宣传栏