Retrofit 2 RequestBody writeTo()方法调用两次

RKS*_*RKS 13 java upload android retrofit2

Retrofit 2 RequestBody writeTo()方法调用两次,我使用的代码如下:

ProgressRequestBody requestVideoFile = new ProgressRequestBody(videoFile, new ProgressRequestBody.UploadCallbacks() {

    VideoUploadStore store = new VideoUploadStore();

    @Override
    public void onProgressUpdate(int percentage) {
        if (!mIsCancelled) {
            Log.i("UploadServiceManager", "Read Percentage : " + percentage);
            data.setUploadPercentage(percentage);
            store.updateUploadData(data);
        }
    }

    @Override
    public void onError() {
        if(!mIsCancelled) {
            data.setUploadPercentage(0);
            store.updateUploadData(data);
        }
    }

    @Override
    public void onFinish() {

    }
});
MultipartBody.Part multipartVideo = MultipartBody.Part.createFormData("File", videoFile.getName(), requestVideoFile);
Run Code Online (Sandbox Code Playgroud)

DRY*_*ver 23

下面的解决方案可能会帮助你,虽然可能为时已晚.:p

删除HttpLoggingInterceptorApi Client中不会执行writeTo()函数两次的对象.基本上,HttpLoggingInterceptor 通过调用writeTo()再次加载数据缓冲区(用于内部日志记录),然后再调用writeTo()将数据上传到服务器.

  HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
  logging.setLevel(HttpLoggingInterceptor.Level.BODY);
  httpClient.addInterceptor(logging);
Run Code Online (Sandbox Code Playgroud)


Squ*_*yMo 9

如果您要用来writeTo()跟踪文件上传进度,则需要区分writeTo(). 基本上可以被链中的任何拦截器调用,例如任何日志拦截器,writeTo()例如 // HttpLoggingInterceptor,并且此方法不提供任何上下文。OkHttpProfilerInterceptorStethoInterceptor

最简单的方法(正如其他答案所指出的)是摆脱那些需要访问请求正文的拦截器。但这可能并不总是可行。

另一个解决方案是利用服务器调用是由CallServerInterceptor链中最后一个拦截器执行的事实(根据文档)。您可以在进一步处理之前检查堆栈跟踪。是的,这很丑。但这样,当其他人出现并添加另一个拦截器时,您就不必修改您的拦截器或为细微的错误留出空间。

override fun writeTo(sink: BufferedSink) {
    val isCalledByCallServerInterceptor = Thread.currentThread().stackTrace.any { stackTraceElement ->
        stackTraceElement.className == CallServerInterceptor::class.java.canonicalName
    }

    // TODO
}
Run Code Online (Sandbox Code Playgroud)


小智 7

将日志级别从 BODY 降低到 HEADERS、BASIC 或 NONE 为我解决了这个问题


ily*_*ets 6

我想出了另一种称为 writeTo() 方法的情况。我使用没有 Retrofit 和 HttpLoggingInterceptor 的 OkHttpClient,我遇到了两次调用的问题。

解决方案:将Android Studio升级到3.1.1并在运行项目配置中启用Advanced Profiling后出现该问题。所以禁用高级分析。