Java 改装两次调用的RequestBody writeTo()方法

Java 改装两次调用的RequestBody writeTo()方法,java,android,upload,retrofit2,Java,Android,Upload,Retrofit2,改装2 RequestBody writeTo()方法调用两次,我使用的代码如下所示: ProgressRequestBody requestVideoFile = new ProgressRequestBody(videoFile, new ProgressRequestBody.UploadCallbacks() { VideoUploadStore store = new VideoUploadStore(); @Override public void onP

改装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);

下面的解决方案可能会对您有所帮助,但可能为时已晚p

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

  HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
  logging.setLevel(HttpLoggingInterceptor.Level.BODY);
  httpClient.addInterceptor(logging);

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

我想出了另一个两次调用writeTo()方法的例子。 我使用OkHttpClient而不进行改装和HttpLoggingInterceptor,我有两次被称为问题


解决方案:将Android Studio升级到3.1.1并在运行项目配置中启用高级评测后,会出现此问题。因此,禁用高级评测。

从正文到标题降低级别并删除HttpLoggingInterceptor对我来说不是一个解决方案,因为它解释了调用api的情况。您可以启动计数器变量,如,
private int firstTimeCounter=0然后

@Override
public void writeTo(BufferedSink sink) throws IOException {
    firstTimeCounter += 1;

    .......
   .......

    if(firstTimeCounter==2){
        try {
            while (total != file.length()) {
                read = source.read(sink.buffer(), SEGMENT_SIZE);
                total += read;
                Log.e("progress ", total + " %");
                sink.flush();
            }
        } finally {
            okhttp3.internal.Util.closeQuietly(source);
        }
    }
}  

你能说出这个问题吗?我刚刚评论了我的日志拦截程序,它工作了,谢谢你的回答和解释。很好的解决方案!删除HttpLoggingInterceptor代码后,不要使用InstantRu。再次运行应用程序将其删除。我认为这是我的一些拦截器造成的,但实际上是日志拦截器造成的。非常感谢你!非常感谢你!伟大的解决方案!感谢您的解释。另一个导致两次调用writeTo()的原因是使用StethoInterceptor从OkHttp捕获流量。如果添加网络拦截器并打开Stetho控制台,您将看到这一点。