使用 RequestBuilder 跟踪上传进度的正确方法是什么?
What is the proper way to track an upload progress using RequestBuilder?
我正在尝试跟踪上传进度。我可以在下载时通过简单地将 ProgressListener
添加到 NetworkManager
来做到这一点
但是当上传和做同样的事情时,我只收到 1 个关于最终上传大小的回电
我在代码中看到有一些处理网络事件类型的私有方法
ConnectionRequest
好像有一个public
方法设置请求类型setWriteRequest
我使用的是简洁的RequestBuilder
,它默认将setWriteRequest
的值设置为true
,只要有一个正文(有)
所以我真的不知道为什么上传大小只返回 1 个回调。我错过了什么吗?
我的最终代码看起来像这样
ActionListener<NetworkEvent> progressListener = new ActionListener<NetworkEvent>(){
@Override
public void actionPerformed(NetworkEvent evt) {
int getSentReceived = evt.getSentReceived();//this only gets total size, no partial upload progress received
}
};
NetworkManager.getInstance().addProgressListener(progressListener);
RequestBuilder req = Rest.post(url).body(body).header("Content-Type", "application/json").fetchAsJsonMap(resp -> {
NetworkManager.getInstance().removeProgressListener(progressListener);
});
编辑:我在模拟器 Android 和 iOS
上仔细检查了此行为
这已经很久没有正常工作了:https://github.com/codenameone/CodenameOne/issues/3043
还有这个:https://github.com/codenameone/CodenameOne/issues/2087
问题的症结在于上传不像下载那样有效。下载时,我们向文件发出请求并将其取回。上传将流写入请求的主体,然后提交该请求。所以将流写入正文很快(并显示进度)但是我们的提交是原子的所以我们无法监控它。
唯一真正的解决方法是避免分段上传或将上传拆分为较小的独立部分。您可以使用提供较低级别可跟踪 API 的 websockets。
编辑:我最终在 iOS 和 Android 本地实现了这个,并发布了一个 CN1Lib,它使用了一个简单的案例(上传单个文本文件并跟踪进度)
我正在尝试跟踪上传进度。我可以在下载时通过简单地将 ProgressListener
添加到 NetworkManager
但是当上传和做同样的事情时,我只收到 1 个关于最终上传大小的回电
我在代码中看到有一些处理网络事件类型的私有方法
ConnectionRequest
好像有一个public
方法设置请求类型setWriteRequest
我使用的是简洁的RequestBuilder
,它默认将setWriteRequest
的值设置为true
,只要有一个正文(有)
所以我真的不知道为什么上传大小只返回 1 个回调。我错过了什么吗?
我的最终代码看起来像这样
ActionListener<NetworkEvent> progressListener = new ActionListener<NetworkEvent>(){
@Override
public void actionPerformed(NetworkEvent evt) {
int getSentReceived = evt.getSentReceived();//this only gets total size, no partial upload progress received
}
};
NetworkManager.getInstance().addProgressListener(progressListener);
RequestBuilder req = Rest.post(url).body(body).header("Content-Type", "application/json").fetchAsJsonMap(resp -> {
NetworkManager.getInstance().removeProgressListener(progressListener);
});
编辑:我在模拟器 Android 和 iOS
上仔细检查了此行为这已经很久没有正常工作了:https://github.com/codenameone/CodenameOne/issues/3043
还有这个:https://github.com/codenameone/CodenameOne/issues/2087
问题的症结在于上传不像下载那样有效。下载时,我们向文件发出请求并将其取回。上传将流写入请求的主体,然后提交该请求。所以将流写入正文很快(并显示进度)但是我们的提交是原子的所以我们无法监控它。
唯一真正的解决方法是避免分段上传或将上传拆分为较小的独立部分。您可以使用提供较低级别可跟踪 API 的 websockets。
编辑:我最终在 iOS 和 Android 本地实现了这个,并发布了一个 CN1Lib,它使用了一个简单的案例(上传单个文本文件并跟踪进度)