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
3天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

这个接口是流式的,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

分享
微博
QQ
微信
回复
3天前
相关问题
HarmonyOS so读取问题
21浏览 • 1回复 待解决
HarmonyOS 关于OH_AudioRenderer问题
423浏览 • 1回复 待解决
关于 SO 文件使用问题
259浏览 • 1回复 待解决
关于自定义XComponent加载so问题
206浏览 • 1回复 待解决
HarmonyOS 关于onKeyEvent生效问题
401浏览 • 1回复 待解决
求助:关于HTTP返回问题
2833浏览 • 1回复 待解决
HarmonyOS 关于OH_NativeXComponent销毁
59浏览 • 1回复 待解决
读取剪贴板是否需要READ_PASTEBOARD权限
2004浏览 • 1回复 待解决
HarmonyOS READ_IMAGEVIDEO权限问题
77浏览 • 1回复 待解决
HarmonyOS 关于http请求返回结果
122浏览 • 1回复 待解决
JS关于process.runCmd接口可行性问题
4462浏览 • 1回复 待解决