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.ResponseBody; import okio.Buffer; import okio.BufferedSource; import okio.ForwardingSource; import okio.Okio; import okio.Source; /** * ?? User:lizhangqu(513163535@qq.com) Date:2015-09-02 Time: 17:18 */ public class ProgressResponseBody extends ResponseBody { // ? private final ResponseBody responseBody; // ? private final ProgressListener progressListener; // ?BufferedSource private BufferedSource bufferedSource; /** * * * @param responseBody * ? * @param progressListener * ? */ public ProgressResponseBody(ResponseBody responseBody, ProgressListener progressListener) { this.responseBody = responseBody; this.progressListener = progressListener; } /** * ??contentType * * @return MediaType */ @Override public MediaType contentType() { return responseBody.contentType(); } /** * ??contentLength * * @return contentLength * @throws IOException * */ @Override public long contentLength() throws IOException { return responseBody.contentLength(); } /** * ?source * * @return BufferedSource * @throws IOException * */ @Override public BufferedSource source() throws IOException { if (bufferedSource == null) { // bufferedSource = Okio.buffer(source(responseBody.source())); } return bufferedSource; } /** * ?? * * @param source * Source * @return Source */ private Source source(Source source) { return new ForwardingSource(source) { // ?? long totalBytesRead = 0L; @Override public long read(Buffer sink, long byteCount) throws IOException { long bytesRead = super.read(sink, byteCount); // ????bytesRead-1 totalBytesRead += bytesRead != -1 ? bytesRead : 0; // contentLength()??-1 if (progressListener != null) { progressListener.onProgress(totalBytesRead, responseBody.contentLength(), bytesRead == -1); } return bytesRead; } }; } }