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)
如果您要用来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)
我想出了另一种称为 writeTo() 方法的情况。我使用没有 Retrofit 和 HttpLoggingInterceptor 的 OkHttpClient,我遇到了两次调用的问题。
解决方案:将Android Studio升级到3.1.1并在运行项目配置中启用Advanced Profiling后出现该问题。所以禁用高级分析。