关于使用AsyncHttpClient做断点上传功能时无法回调进度的问题

本文探讨了在使用AsyncHttpClient进行断点上传时遇到的无法回调进度问题。通过实现AsyncHttpResponseHandler并覆盖其onProgress方法,可以监测上传任务的开始、结束和进度。若需获取完整代码解决方案,可在评论区留言提供邮箱地址。
摘要由CSDN通过智能技术生成

在使用AsyncHttpClient做简单的非断点上传功能时,我们要想实时检测任务的开始、结束以及进度,需要实现AsyncHttpResponseHandler,并复写其各种onXXX()方法。代码如下:


    
    
    
  1. @Override
  2. public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
  3. }
  4. @Override
  5. public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
  6. }
  7. @Override
  8. public void onProgress(long bytesWritten, long totalSize) {
  9. }
  10. @Override
  11. public void onCancel() {
  12. }
  13. @Override
  14. public void onFinish() {
  15. }
  16. @Override
  17. public void onRetry(int retryNo) {
  18. }
  19. @Override
  20. public void onStart() {
  21. }

其中,在onProgress里,我们可以得到上传的进度。以上说的是简单上传,运行一点问题都没有。
可是当我按照服务端提供的接口做断点上传时,onProgress就不能正常的返回进度了。为了找出原因,我对两种情况的http请求都进行了抓包,发现原因出在http请求头里。在简单上传时,请求头里的"Content-Type"字段默认为 "multipart/form-data"的形式,而服务端给我的接口中,请求头里的"Content-Type"必须是"application/octet-stream"。
为什么只是改了个请求头就不能回调进度了呢?我想只有在框架源码中才能找到答案。只有找到 onProgress这个回调最原始的地方才能知道原因。我先在 AsyncHttpResponseHandler里找到了这个 onProgress方法:

    
    
    
  1. /**
  2. * Fired when the request progress, override to handle in your own code
  3. *
  4. * @param bytesWritten offset from start of file
  5. * @param totalSize total size of file
  6. */
  7. public void onProgress(long bytesWritten, long totalSize) {
  8. AsyncHttpClient.log.v(LOG_TAG, String.format("Progress %d from %d (%2.0f%%)", bytesWritten, totalSize, (totalSize > 0) ? (bytesWritten * 1.0 / totalSize) * 100 : -1));
  9. }

发现它是在一个handleMessage方法的一个等于PROGRESS_MESSAGE 的case分支中被调用的:

   
   
   
  1. case PROGRESS_MESSAGE:
  2. response = (Object[]) message.obj;
  3. if (response != null && response.length >= 2) {
  4. try {
  5. onProgress((Long) response[0], (Long) response[1]);
  6. } catch (Throwable t) {
  7. AsyncHttpClient.log.e(LOG_TAG, "custom onProgress contains an error", t);
  8. }
  9. } else {
  10. AsyncHttpClient.log.e(LOG_TAG, "PROGRESS_MESSAGE didn't got enough params");
  11. }
  12. break;

接着找到这个PROGRESS_MESSAGE 是在sendProgressMessage方法中传递过来的。而这个 sendProgressMessage方法是复写的方法。它是在 AsyncHttpResponseHandler的父类 ResponseHandlerInterface中被定义的。

   
   
   
  1. @Override
  2. final public void sendProgressMessage(long bytesWritten, long bytesTotal) {
  3. sendMessage(obtainMessage(PROGRESS_MESSAGE,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值