HarmonyOS 鸿蒙Next中服务卡片无法获取数据

HarmonyOS 鸿蒙Next中服务卡片无法获取数据 【问题描述】:当前使用服务卡片需要展示对应生理周期相关的信息: 例如 当前是经期多少天等 具体数据为接口返回,当前实现方式为 主进程内请求数据 然后保存数据至首选项缓存;

【问题现象】:服务卡片设置定时刷新 在定时刷新的方法内 去获取首选项缓存数据来刷新卡片信息; 但是当前发现 使用首选项缓存 卡片并没有获取到相关数据

【版本信息】:不涉及

【复现代码】:

//此处为EntryFormAbility 的onUpdateForm方法实现
onUpdateForm(formId: string) {

    // Called to notify the form provider to update a specified form.

    let resultInfo:object[] = [];
    // 这一段注释 卡片的periodStateDes字段会显示 345 放开则显示卡片最初的字段 不会显示 123或者345

    const context = getContext(this) as common.UIAbilityContext;

    preferences.removePreferencesFromCacheSync(context,'testDataSave')

    let perferceObj = preferences.getPreferencesSync(context,{name:"testDataSave"})//.getSync("test",[]) as object[];

    if (perferceObj) {

      let result = perferceObj.getSync("test",[]) as object[];

      if (result) {

        resultInfo.push()
      }
    }
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

    const charArray = chars.split(''); // 空字符串作为分隔符

    let result = '';

    for (let i = 0; i < 5; i++) {

      const randomIndex = Math.floor(Math.random() * chars.length);

      result += charArray[randomIndex];

    }
    const bindingData: formBindingData.FormBindingData = formBindingData.createFormBindingData({

      'titleForm':result,

      'periodStateDes':resultInfo.length > 0 ? "123":"345",

    });

    setTimeout(()=>{

      formProvider.updateForm(formId, bindingData).then((data) => {

        console.info('FormAbility updateForm success.' + JSON.stringify(bindingData));

      }).catch((error:BusinessError) => {

        console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
      })
    }, 500)
  }
//在EntryAbility中创建了首选项缓存
    preferences.getPreferencesSync(this.context,{name:"testDataSave"});

【尝试解决方案】:尝试了不同进程的内存不共享,同一进程中qetPreferences只有首次会从持久化中取,所以要跨进程读取最新的持久化数据时,通过preferences.removePreferencesFromCache接口将Preferences实例移出缓存中的实例之后,再次getPreferences将会重新读取持久化文件,生成新的Preferences实例。以主应用中更新首选顶中的data,在服务卡片中通过首选项取data为例。

但是在实际使用中使用preferences.removePreferencesFromCache后在读获取Preferences实例,卡片刷新函数感觉是有报错 无法看到日志 且没有数据刷新操作


更多关于HarmonyOS 鸿蒙Next中服务卡片无法获取数据的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

试试MMKV来存储呢,MMKV 支持跨进程共享

[https://ohpm.openharmony.cn/#/cn/detail/@tencent%2Fmmkv](https://ohpm.openharmony.cn/#/cn/detail/@tencent%2Fmmkv)

更多关于HarmonyOS 鸿蒙Next中服务卡片无法获取数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,服务卡片无法获取数据可能由以下原因导致:卡片提供方未正确配置数据源或数据请求权限;卡片生命周期管理不当,未在onCreate或onUpdate方法中实现数据加载;分布式数据管理未启用或设备间数据同步失败;卡片配置文件(config.json)中数据能力声明不完整。检查卡片代码中数据请求逻辑,确保使用鸿蒙数据管理API(如DataAbility)并正确声明所需权限。

在HarmonyOS Next中,服务卡片与主应用属于不同进程,直接通过首选项缓存共享数据确实会遇到问题。从你的代码分析,主要问题在于:

  1. 进程隔离导致的数据不同步:虽然你使用了removePreferencesFromCacheSync尝试强制重新读取,但跨进程的首选项访问需要确保数据已持久化到磁盘。

  2. 代码逻辑问题:在onUpdateForm方法中,resultInfo.push()没有参数,这会导致空数组,所以periodStateDes始终显示"345"。

建议修改方案:

onUpdateForm(formId: string) {
  const context = getContext(this) as common.UIAbilityContext;
  
  // 确保先移除缓存实例
  preferences.removePreferencesFromCacheSync(context, 'testDataSave');
  
  let perferceObj = preferences.getPreferencesSync(context, {name: "testDataSave"});
  
  if (perferceObj) {
    let result = perferceObj.getSync("test", []) as object[];
    
    const bindingData = formBindingData.createFormBindingData({
      'titleForm': 'your_title',
      'periodStateDes': result.length > 0 ? "123" : "345",
    });
    
    formProvider.updateForm(formId, bindingData).then((data) => {
      console.info('FormAbility updateForm success.');
    }).catch((error: BusinessError) => {
      console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
    });
  }
}

同时确保在主应用更新数据时调用preferences.flush()强制写入磁盘,确保服务卡片能读取到最新数据。

回到顶部