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 so包读取问题
21浏览 • 1回复 待解决
HarmonyOS 关于OH_AudioRenderer的问题
423浏览 • 1回复 待解决
关于 SO 文件的使用问题
259浏览 • 1回复 待解决
HarmonyOS 如何读取本地图片的实际长宽
26浏览 • 1回复 待解决
OH_Audio在使用接口OH_AudioCapturer_Start采集的时候,不走采集的回调
1994浏览 • 2回复 待解决
关于自定义的XComponent加载so的问题
206浏览 • 1回复 待解决
HarmonyOS 关于接口返回数据就显示 [object object ],解析不出来具体数据的问题
64浏览 • 1回复 待解决
HarmonyOS 关于onKeyEvent不生效问题
401浏览 • 1回复 待解决
HarmonyOS 关于文件上传成功后无法获取接口返回的信息
110浏览 • 1回复 待解决
HarmonyOS OH系统的实际文管系统应该对应哪个路径?
91浏览 • 1回复 待解决
求助:关于HTTP返回值的问题
2833浏览 • 1回复 待解决
HarmonyOS 关于OH_NativeXComponent的销毁
59浏览 • 1回复 待解决
HarmonyOS 读取图片数据接口,执行顺序问题
50浏览 • 1回复 待解决
HarmonyOS OH_AVScreenCapture_StartScreenRecording接口权限问题咨询
500浏览 • 1回复 待解决
HarmonyOS 关于使用获取屏幕截图接口异常的问题
598浏览 • 1回复 待解决
#鸿蒙通关秘籍#如何在HarmonyOS中读取Rawfile文件的剩余长度?
105浏览 • 1回复 待解决
HarmonyOS 关于定位接口部分字段为空的问题咨询
92浏览 • 1回复 待解决
读取剪贴板是否需要READ_PASTEBOARD权限
2004浏览 • 1回复 待解决
HarmonyOS getRawFileContentSync读取rawfile下的文件返回空
180浏览 • 1回复 待解决
HarmonyOS OH_ImageSourceNative_GetImageProperty返回值的含义
22浏览 • 1回复 待解决
HarmonyOS 关于接口数据使用ECC加密问题
20浏览 • 1回复 待解决
HarmonyOS READ_IMAGEVIDEO权限问题
77浏览 • 1回复 待解决
HarmonyOS 读取resources/rawfile目录,目前oh侧没有对应的api
58浏览 • 1回复 待解决
HarmonyOS 关于http请求的返回结果
122浏览 • 1回复 待解决
JS关于process.runCmd接口的可行性问题
4462浏览 • 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