Java tutorial
/** * Copyright 2015 ZhangQu Li * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.yehui.utils.http.downfileprogress.progress; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.RequestBody; import com.yehui.utils.http.downfileprogress.listener.ProgressListener; import java.io.IOException; import okio.Buffer; import okio.BufferedSink; import okio.ForwardingSink; import okio.Okio; import okio.Sink; /** * ? * User:lizhangqu(513163535@qq.com) * Date:2015-09-02 * Time: 17:15 */ public class ProgressRequestBody extends RequestBody { // private final RequestBody requestBody; //? private final ProgressListener progressListener; //?BufferedSink private BufferedSink bufferedSink; /** * * @param requestBody * @param progressListener ? */ public ProgressRequestBody(RequestBody requestBody, ProgressListener progressListener) { this.requestBody = requestBody; this.progressListener = progressListener; } /** * ??contentType * @return MediaType */ @Override public MediaType contentType() { return requestBody.contentType(); } /** * ??contentLength * @return contentLength * @throws IOException */ @Override public long contentLength() throws IOException { return requestBody.contentLength(); } /** * ? * @param sink BufferedSink * @throws IOException */ @Override public void writeTo(BufferedSink sink) throws IOException { if (bufferedSink == null) { // bufferedSink = Okio.buffer(sink(sink)); } // requestBody.writeTo(bufferedSink); //flush????? bufferedSink.flush(); } /** * ? * @param sink Sink * @return Sink */ private Sink sink(Sink sink) { return new ForwardingSink(sink) { //? long bytesWritten = 0L; //??contentLength() long contentLength = 0L; @Override public void write(Buffer source, long byteCount) throws IOException { super.write(source, byteCount); if (contentLength == 0) { //contentLength??? contentLength = contentLength(); } //? bytesWritten += byteCount; // if (progressListener != null) { progressListener.onProgress(bytesWritten, contentLength, bytesWritten == contentLength); } } }; } }