使用 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,它使用了一个简单的案例(上传单个文本文件并跟踪进度)

https://github.com/javieranton-zz/ProgressUploader