本文共 3963 字,大约阅读时间需要 13 分钟。
webInterface = new Retrofit.Builder() .baseUrl(hostname) .client(client)//这个client是OkHttpClient,以后和Okhttp的基本用法和流程分析中细说 .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .addConverterFactory(GsonConverterFactory.create(new Gson())) .build() .create(WebInterface.class);
public interface WebInterface { @POST("/***/index") ObservablegetHomeIndex(@Body BaseRequest request);//首页 @FormUrlEncoded @POST("/***/freecall") Observable freeCall(@Field("phone") String phone);//免费电话}
dataWork = WebHelper.getWebInterface() .getHomeIndex(request) .compose(new WebTransformer<>(this)) .subscribe(new WebSubscriber() { @Override public void onSuccess(IndexResponse response) { parseData(response); } });
@Override public void onDestroy() { super.onDestroy(); if (dataWork != null) { dataWork.isUnsubscribed(); } }
public class WebTransformerimplements Observable.Transformer { Context context; boolean hasDialog = true; public WebTransformer(Context context) { this.context = context; } public WebTransformer(Context context, boolean hasDialog) { this.context = context; this.hasDialog = hasDialog; } @Override public Observable call(Observable observable) { return observable.subscribeOn(Schedulers.io()) .doOnSubscribe(new Action0() { @Override public void call() { if (hasDialog) { DialogHelper.showDialog(context); } } }) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread()); }}
public abstract class WebSubscriberextends Subscriber { @Override public void onCompleted() { } @Override public void onNext(T t) { DialogHelper.hideDialog(); //居然还有的返回值不是继承BaseResponse,我想杀了后台,别拦我 if (t instanceof BaseResponse) { BaseResponse baseResponse = (BaseResponse) t; //不要问我为什么这么多code,我也不知道后台怎么想的 if (baseResponse.getCode() != 0 || baseResponse.getResultCode() != 0 || baseResponse.getReplyCode() != 0) { String tip = ""; //不要问我为什么这么多message,我也不知道后台怎么想的 if (!TextUtils.isEmpty(baseResponse.getMessage())) { tip = baseResponse.getMessage(); } else { tip = baseResponse.getRemark(); } ToastHelper.show(tip); onFailed(t); } else { onSuccess(t); } } else { onSuccess(t); } } @Override public void onError(Throwable e) { DialogHelper.hideDialog(); if (e instanceof HttpException) { ToastHelper.show("网络异常"); HttpException exception = (HttpException) e; if (exception.code() == 404) { //没登陆的时候居然返回404,我想杀了后台,别拦我 SkipManager.gotoLogin(); } } } //需要个性化的错误处理时,重写它 protected void onFailed(T t) { } //正确的回调 public abstract void onSuccess(T t);}
Q1.什么是网络框架?
业务层-->网络调度层-->网络执行层这里:
Retrofit是网络调度层 类似volley, retrofit, android-async-http 做具体业务请求、线程切换、数据转换OkHttp是网络执行层
类似HttpClient, HttpUrlConnection 做底层网络请求Q2.为什么用Retrofit?
因为Retrofit有:CallAdapter-请求适配器: 可以实现多种请求响应形式:同步方式、异步回调方式、RxJava方式Converter-数据转换器: 可以自己定义responseBodyConverter和requestBodyConverter,实现加密功能和各种奇葩格式的解析转载地址:http://pzrgf.baihongyu.com/