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 cn.com.crcement.oa.base.download.progress; import java.io.IOException; import cn.com.crcement.oa.base.download.listener.ProgressListener; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.RequestBody; 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); } } }; } }