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.edu.zafu.coreprogress.progress; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.ResponseBody; import java.io.IOException; import cn.edu.zafu.coreprogress.listener.ProgressListener; 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; } }; } }