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.zgh.trshttp.provider.okhttp.body; import android.os.Handler; import com.squareup.okhttp.MediaType; import com.squareup.okhttp.ResponseBody; import com.zgh.trshttp.callback.TRSFileDownloadHttpCallback; import java.io.IOException; import okio.*; /** * Created by Vincent Woo * Date: 2015/12/23 * Time: 11:22 */ public class ProgressResponseBody extends ResponseBody { //? private final ResponseBody responseBody; //? private final TRSFileDownloadHttpCallback progressListener; //?BufferedSource private BufferedSource bufferedSource; private Handler delivery; /** * * * @param responseBody ? * @param progressListener ? */ public ProgressResponseBody(ResponseBody responseBody, TRSFileDownloadHttpCallback progressListener, Handler delivery) { this.responseBody = responseBody; this.progressListener = progressListener; this.delivery = delivery; } /** * ??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 { final long bytesRead = super.read(sink, byteCount); //????bytesRead-1 totalBytesRead += bytesRead != -1 ? bytesRead : 0; //contentLength()??-1 if (progressListener != null) { delivery.post(new Runnable() { @Override public void run() { try { progressListener.onProgress(totalBytesRead, responseBody.contentLength(), bytesRead == -1); } catch (IOException e) { e.printStackTrace(); } } }); } return bytesRead; } }; } }