日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android-封装网络请求Retrofit+Rxjava可实现上传下载进度监听

發(fā)布時(shí)間:2023/12/31 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android-封装网络请求Retrofit+Rxjava可实现上传下载进度监听 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.添加依賴

build.gradle:
//gson解析
api rootProject.ext.dependencies[“gson”]
api rootProject.ext.dependencies[“retrofit”]
//retrofit2.0
api rootProject.ext.dependencies[“adapter-rxjava2”]
//配合Rxjava 使用
api rootProject.ext.dependencies[“converter-gson”]
//ConverterFactory的Gson:
api rootProject.ext.dependencies[“rxjava”]
//rxjava
api rootProject.ext.dependencies[“rxandroid”]

config.gradle:
//gson解析
“gson” : ‘com.google.code.gson:gson:2.8.2’,
“retrofit” : ‘com.squareup.retrofit2:retrofit:2.0.2’,
//retrofit2.0
“adapter-rxjava2” : ‘com.squareup.retrofit2:adapter-rxjava2:2.3.0’,
//配合Rxjava 使用
“converter-gson” : ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’,
//ConverterFactory的Gson:
“rxjava” : ‘io.reactivex.rxjava2:rxjava:2.1.8’,
//rxjava
“rxandroid” : ‘io.reactivex.rxjava2:rxandroid:2.0.1’,
//日志攔截器
“l(fā)ogging-interceptor” : ‘com.squareup.okhttp3:logging-interceptor:3.5.0’,
//防止Rxjava引發(fā)的內(nèi)存泄漏
“rxlifecycle” : ‘com.trello.rxlifecycle2:rxlifecycle-components:2.1.0’,

2.HttpManager.java 工具類

public class HttpManager {
//鏈接超時(shí)
private static int mConnectTimeout = 20;
//讀超時(shí)
private static int mReadTimeOut = 20;
//寫(xiě)超時(shí)
private static int mWriteTimeOut = 20;
//okhttp請(qǐng)求的客戶端
private OkHttpClient.Builder mClient;
//Retrofit請(qǐng)求Builder
private Retrofit.Builder builder;
//instance
private static volatile HttpManager instance;

//初始化 private HttpManager(){initOkHttp();initRetrofit(); }//單例 public static HttpManager newInstance(){if (instance == null){synchronized (HttpManager.class){if (instance == null){instance = new HttpManager();}}}return instance; }//初始化OkHttpClient private void initOkHttp(){mClient = new OkHttpClient.Builder();// 設(shè)置連接超時(shí)時(shí)間mClient.connectTimeout(mConnectTimeout, TimeUnit.SECONDS);// 設(shè)置讀取數(shù)據(jù)超時(shí)時(shí)間mClient.readTimeout(mReadTimeOut, TimeUnit.SECONDS);// 設(shè)置寫(xiě)入超時(shí)時(shí)間mClient.writeTimeout(mWriteTimeOut,TimeUnit.SECONDS);// 設(shè)置進(jìn)行連接失敗重試mClient.retryOnConnectionFailure(true);//打印攔截器日志mClient.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)); }//初始化Retrofit private void initRetrofit(){builder = new Retrofit.Builder();builder.baseUrl(Api.BASE_URL);//Gson轉(zhuǎn)換

// builder.addConverterFactory(LenientGsonConverterFactory.create());
builder.addConverterFactory(GsonConverterFactory.create());
//RxJava轉(zhuǎn)換
builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());
}

//獲取對(duì)應(yīng)的Service public <T> T createService(Class<T> service){mClient.addInterceptor(new HttpCommonInterceptor());return builder.client(mClient.build()).build().create(service); }//獲取對(duì)應(yīng)的上傳Service(帶響應(yīng)進(jìn)度) public <T> T createReqeustService(Class<T> service,ReqProgressCallBack callBack){mClient.addInterceptor(new HttpReqeustInterceptor(callBack));return builder.client(mClient.build()).build().create(service); }//獲取對(duì)應(yīng)的下載Service(帶響應(yīng)進(jìn)度) public <T> T createResponseService(Class<T> service,ReqProgressCallBack callBack){mClient.addInterceptor(new HttpResponseInterceptor(callBack));return builder.client(mClient.build()).build().create(service); }

3.添加攔截器HttpResponseInterceptor.java 和 HttpReqeustInterceptor.java

//文件下載
public class HttpResponseInterceptor implements Interceptor {

private ReqProgressCallBack callBack;public HttpResponseInterceptor(ReqProgressCallBack callBack){this.callBack = callBack; }@Override public Response intercept(Chain chain) throws IOException {Response response = chain.proceed(chain.request());//包裝響應(yīng)體return response.newBuilder().body(new ProgressResponseBody(response.body(),callBack)).build(); }

//文件上傳
public class HttpReqeustInterceptor implements Interceptor {

private ReqProgressCallBack callBack;public HttpReqeustInterceptor(ReqProgressCallBack callBack){this.callBack = callBack; }@Override public Response intercept(Chain chain) throws IOException {Request request = chain.request();//包裝響應(yīng)體request.newBuilder().method(request.method(),new ProgressRequestBody(request.body(),callBack)).build();return chain.proceed(request); }

}

4.重寫(xiě)ResponseBody監(jiān)聽(tīng)文件下載進(jìn)度

public class ProgressResponseBody extends ResponseBody {

private ResponseBody mResponseBody; private BufferedSource mBufferedSource; private ReqProgressCallBack callBack;public ProgressResponseBody(ResponseBody body,ReqProgressCallBack callBack){this.mResponseBody = body;this.callBack = callBack; }@Nullable @Override public MediaType contentType() {return mResponseBody.contentType(); }@Override public long contentLength() {return mResponseBody.contentLength(); }@Override public BufferedSource source() {if (mBufferedSource == null){mBufferedSource = Okio.buffer(source(mResponseBody.source()));}return mBufferedSource; }private Source source(Source source){ForwardingSource so = new ForwardingSource(source) {long totalSize = 0l;@Overridepublic long read(Buffer sink, long byteCount) throws IOException {long currentSize = super.read(sink,byteCount);// read() returns the number of bytes read, or -1 if this source is exhausted.totalSize += currentSize != -1 ? currentSize : 0;//當(dāng)前下載的百分比進(jìn)度int progress = (int) (totalSize * 100 / mResponseBody.contentLength());if (callBack != null){callBack.onProgress(FormatUtils.bytes2kb(mResponseBody.contentLength()),FormatUtils.bytes2kb(totalSize),progress + "%",currentSize == -1);}return currentSize;}};return so; }

5.重寫(xiě)RequestBody監(jiān)聽(tīng)文件上傳進(jìn)度

public class ProgressRequestBody extends RequestBody {

//實(shí)際的待包裝請(qǐng)求體 private RequestBody mRequestBody; //進(jìn)度回調(diào)接口 private ReqProgressCallBack mCallBack; //包裝完成的BufferedSink private BufferedSink mSink;public ProgressRequestBody(RequestBody body, ReqProgressCallBack callBack){this.mRequestBody = body;this.mCallBack = callBack; }@Override public MediaType contentType() {return mRequestBody.contentType(); }@Override public long contentLength() throws IOException {return mRequestBody.contentLength(); }@Override public void writeTo(BufferedSink s) throws IOException {if (mSink == null){mSink = Okio.buffer(sink(s));}//寫(xiě)入mRequestBody.writeTo(mSink);//必須調(diào)用flush,否則最后一部分?jǐn)?shù)據(jù)可能不會(huì)被寫(xiě)入mSink.flush(); }private Sink sink(Sink sink){ForwardingSink s = new ForwardingSink(sink) {//當(dāng)前寫(xiě)入字節(jié)數(shù)long currentSize = 0L;//總字節(jié)長(zhǎng)度,避免多次調(diào)用contentLength()方法long totalSize = 0L;@Overridepublic void write(Buffer source, long byteCount) throws IOException {super.write(source, byteCount);if (totalSize == 0) {//獲得contentLength的值,后續(xù)不再調(diào)用totalSize = contentLength();}//增加當(dāng)前寫(xiě)入的字節(jié)數(shù)currentSize += byteCount;//當(dāng)前上傳的百分比進(jìn)度int progress = (int) (currentSize * 100 / totalSize);

// int progress = (int) (((float) currentSize) / ((float) totalSize) * 100);
boolean done = totalSize == currentSize;
//回調(diào)
if(mCallBack != null){
mCallBack.onProgress(FormatUtils.bytes2kb(totalSize),
FormatUtils.bytes2kb(currentSize),
progress + “”,done);
}
}
};
return s;
}
}

6.封裝線程切換幫助類RxHelper.java

public class RxHelper {

public static <T> ObservableTransformer<T, T> observableIO2Main(final Context context) {return upstream -> {Observable<T> observable = upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());return composeContext(context, observable);}; }public static <T> ObservableTransformer<T, T> observableIO2Main(final RxFragment fragment) {return upstream -> upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).compose(fragment.<T>bindToLifecycle()); }public static <T> FlowableTransformer<T, T> flowableIO2Main() {return upstream -> upstream.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); }private static <T> ObservableSource<T> composeContext(Context context, Observable<T> observable) {if(context instanceof RxActivity) {return observable.compose(((RxActivity) context).bindUntilEvent(ActivityEvent.DESTROY));} else if(context instanceof RxFragmentActivity){return observable.compose(((RxFragmentActivity) context).bindUntilEvent(ActivityEvent.DESTROY));}else if(context instanceof RxAppCompatActivity){return observable.compose(((RxAppCompatActivity) context).bindUntilEvent(ActivityEvent.DESTROY));}else {return observable;} }

7.異常處理工具類RxExceptionUtil.java

public class RxExceptionUtil {

public static String exceptionHandler(Throwable e){if (e instanceof UnknownHostException){return "網(wǎng)絡(luò)不可用";}else if (e instanceof ConnectException){return "連接錯(cuò)誤";}else if (e instanceof SocketTimeoutException){return "請(qǐng)求網(wǎng)絡(luò)超時(shí)";}else if (e instanceof HttpException){return convertStatusCode((HttpException) e);}else if (e instanceof ParseException || e instanceof JSONException){return "數(shù)據(jù)解析錯(cuò)誤";}return "未知錯(cuò)誤"; }private static String convertStatusCode(HttpException e){if (e.code() >= 500 && e.code() < 600){return "服務(wù)器處理請(qǐng)求出錯(cuò)";}else if (e.code() >= 400 && e.code() < 500){return "服務(wù)器無(wú)法處理請(qǐng)求";}else if (e.code() >= 300 && e.code() < 400){return "請(qǐng)求被重定向到其他頁(yè)面";}return e.message(); }

}

8.封裝BaseObserver.java

public abstract class BaseObserver implements Observer<BaseResponse> {

@Override public void onSubscribe(Disposable d) {LogUtils.loge("onSubscribe ===================》"); }@Override public void onNext(BaseResponse<T> response) {LogUtils.loge("onNext ===================》");//對(duì)基礎(chǔ)數(shù)據(jù) 進(jìn)行統(tǒng)一處理if (response.isSuccess()){LogUtils.loge("開(kāi)始打印數(shù)據(jù)===================》");LogUtils.loge(response.getData().toString());LogUtils.loge(response.getMessage());LogUtils.loge("結(jié)束打印數(shù)據(jù)===================》");onSuccess(response.getData());}else {onFailure(null,response.getMessage());} }@Override public void onError(Throwable e) {LogUtils.loge("onError ===================》" + e.toString());onFailure(e, RxExceptionUtil.exceptionHandler(e)); }@Override public void onComplete() {LogUtils.loge("onComplete ===================》"); }public abstract void onSuccess(T t);public abstract void onFailure(Throwable e,String errorMsg);

}

9.封裝JavaBean

public class BaseResponse {

private int status; private String message; private T data;public boolean isSuccess(){return status == 200; }public int getStatus() {return status; }public void setStatus(int status) {this.status = status; }public String getMessage() {return message; }public void setMessage(String message) {this.message = message; }public T getData() {return data; }public void setData(T data) {this.data = data; }

}

10.常用Api

public interface BaseApiService {

@POST Observable<BaseResponse<LoginResponse>> login();@GET("20110628/1369025_192645024000_2.jpg") Observable<ResponseBody> downLoadFile(); //doukx.apk@GET() Flowable<ResponseBody> get(@Url String url);@GET() Flowable<ResponseBody> get(@Url String url, @QueryMap Map<String, String> maps);@POST() @FormUrlEncoded Flowable<ResponseBody> post(@Url String url, @FieldMap Map<String, String> maps);@POST() Flowable<ResponseBody> postBody(@Url String url, @Body Object object);@DELETE() Flowable<ResponseBody> delete(@Url String url, @QueryMap Map<String, String> maps);@PUT() Flowable<ResponseBody> put(@Url String url, @QueryMap Map<String, String> maps);@POST() Flowable<ResponseBody> putBody(@Url String url, @Body Object object);@Multipart @POST() Flowable<ResponseBody> uploadFlie(@Url String fileUrl, @Part("description") RequestBody description, @Part("files") MultipartBody.Part file);@Multipart @POST() Flowable<ResponseBody> uploadFiles(@Url String url, @PartMap() Map<String, RequestBody> maps);@Multipart @POST() Flowable<ResponseBody> uploadFiles(@Url String url, @Part() List<MultipartBody.Part> parts);@Streaming @GET Flowable<ResponseBody> downloadFile(@Url String fileUrl);@POST() @Headers({"Content-Type: application/json", "Accept: application/json"}) Flowable<ResponseBody> postJson(@Url String url, @Body RequestBody jsonBody);@POST() Flowable<ResponseBody> postBody(@Url String url, @Body RequestBody body);

}

總結(jié)

以上是生活随笔為你收集整理的Android-封装网络请求Retrofit+Rxjava可实现上传下载进度监听的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。