HarmonyOS 关于libohweb.so的接口OH_ArkWebHttpBodyStream_Read不返回读取实际长度的问题
接口的描述如下:
/**
 @brief Read the http body to the buffer.
 The buffer must be larger than the bufLen. We will be reading data from a worker thread to the buffer,\n
 so should not use the buffer in other threads before the callback to avoid concurrency issues.\n
 @param httpBodyStream The ArkWeb_HttpBodyStream.
 @param buffer The buffer to receive data.
 @param bufLen The size of bytes to read.
 @syscap SystemCapability.Web.Webview.Core
 @since 12/void OH_ArkWebHttpBodyStream_Read(const ArkWeb_HttpBodyStream httpBodyStream, uint8_t* buffer, int bufLen);
该接口并未返回实际读取的长度.
可能引发问题:
1.当包体过大,声明的函数内or 语句块的临时变量过大会引发 omm 问题
2.如果采用一下方式来规避 1 的问题,就发生了多次拷贝而影响性能问题
例如回调函数返回的数据长度超出 10MB
//在OH_ArkWebHttpBodyStream_Read 接口未发生变更的情况下,就会是以下的形态
void ReadCallback(const ArkWeb_HttpBodyStream  *httpBodyStream, uint8_t* buffer, int bytesRead)
{
  OH_LOG_INFO(LOG_APP, "read http body back.");
  bool isEof = OH_ArkWebHttpBodyStream_IsEof(httpBodyStream);
  int pos = 0;
  char* p = (char*)calloc(1,bytesRead);
  while((!isEof) && (pos != bytesRead)){
    uint8_t tmp[1024] = {0};
    memset(tmp,0,sizeof(tmp));
    OH_ArkWebHttpBodyStream_Read(httpBodyStream, tmp, sizeof(tmp));
    int lastPos = pos;
    pos += sizeof(tmp);
    if(pos > bytesRead){
      pos = bytesRead;
    }
    memcpy(p+lastPos,tmp,pos - lastPos);
  }
}
//如果接口OH_ArkWebHttpBodyStream_Read返回实际读取的长度,函数将是以下形态
void ReadCallback(const ArkWeb_HttpBodyStream  *httpBodyStream, uint8_t* buffer, int bytesRead)
{
  OH_LOG_INFO(LOG_APP, "read http body back.");
  bool isEof = OH_ArkWebHttpBodyStream_IsEof(httpBodyStream);
  int pos = 0;
  char* p = (char*)calloc(1,bytesRead);
  while((!isEof) && (pos != bytesRead)){
    int readSize = OH_ArkWebHttpBodyStream_Read(httpBodyStream, p+pos, bytesRead-pos);
    if(readSize < 0){
      //获取上次读取的错误接口
      break;
    }
    pos += readSize;
  }
}
1.降低拷贝次数
2.降低发生 omm 的可能
        HarmonyOS
      
        赞
        
 收藏 0
 回答 1
 
        待解决
        
相关问题
 HarmonyOS 关于OH_AudioRenderer的问题 
1336浏览  • 1回复 待解决
HarmonyOS  so包读取问题 
952浏览  • 1回复 待解决
关于 SO 文件的使用问题 
1376浏览  • 1回复 待解决
OH_Audio在使用接口OH_AudioCapturer_Start采集的时候,不走采集的回调 
3013浏览  • 2回复 待解决
HarmonyOS 如何读取本地图片的实际长宽 
900浏览  • 1回复 待解决
关于自定义的XComponent加载so的问题 
1207浏览  • 1回复 待解决
HarmonyOS 关于文件上传成功后无法获取接口返回的信息 
1059浏览  • 1回复 待解决
HarmonyOS OH系统的实际文管系统应该对应哪个路径? 
1275浏览  • 1回复 待解决
HarmonyOS 关于接口返回数据就显示 [object object ],解析不出来具体数据的问题 
1795浏览  • 1回复 待解决
求助:关于HTTP返回值的问题 
4135浏览  • 1回复 待解决
HarmonyOS 关于onKeyEvent不生效问题 
1830浏览  • 1回复 待解决
HarmonyOS的硬解接口关于B帧返回的pts是否按顺序 
814浏览  • 1回复 待解决
HarmonyOS 关于OH_NativeXComponent的销毁 
1200浏览  • 1回复 待解决
HarmonyOS 读取图片数据接口,执行顺序问题 
991浏览  • 1回复 待解决
HarmonyOS 关于使用获取屏幕截图接口异常的问题 
1831浏览  • 1回复 待解决
HarmonyOS OH_AVScreenCapture_StartScreenRecording接口权限问题咨询 
1441浏览  • 1回复 待解决
关于鸿蒙next中flutter调用c++的so库问题 
904浏览  • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中读取Rawfile文件的剩余长度? 
1315浏览  • 1回复 待解决
HarmonyOS  关于定位接口部分字段为空的问题咨询 
1076浏览  • 1回复 待解决
HarmonyOS 关于接口数据使用ECC加密问题 
799浏览  • 1回复 待解决
读取剪贴板是否需要READ_PASTEBOARD权限 
3268浏览  • 1回复 待解决
JS关于process.runCmd接口的可行性问题 
5852浏览  • 1回复 待解决
HarmonyOS getRawFileContentSync读取rawfile下的文件返回空 
1129浏览  • 1回复 待解决
HarmonyOS 读取resources/rawfile目录,目前oh侧没有对应的api 
860浏览  • 1回复 待解决





















这个接口是流式的,OH_ArkWebHttpBodyStream_Read不会返回实际读取长度,是应用来控制的,应用不应该声明太大的buffer ,可以在异步线程读的,没有影响性能
buffer的大小必须大于bufLen。我们将从工作线程读取数据到buffer,因此在回调函数返回之前,不应在其他线程中使用buffer,以避免并发问题。
参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/_web-V5#oh_arkwebhttpbodystream_read
使用方法参考OH_ArkWebResourceRequest_GetHttpBodyStream,https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/web/web-scheme-handler.md