写在前面:
在封装框架时,我们通常会在数据请求框架上再封一层,以便当我们需要对网络框架进行修改时,只需在内部替换框架即可,对我们的App项目中的使用不影响
在封装框架时,我们通常会在数据请求框架上再封一层,以便当我们需要对网络框架进行修改时,只需在内部替换框架即可,对我们的App项目中的使用不影响
1. 最外层封装,在项目中可直接使用的工具类
public static
Call<LoginBean>
login
(String userName
,
String password) {
HttpParams params = new HttpParams(); params.putHeaders("Referer", LOGIN_URL); params.putHeaders("User-Agent", USER_AGENT); params.put("from", LOGIN_URL); params.put("service", "client_transaction"); params.put("username", userName); params.put("password", password); return HttpTools.get(LOGIN_URL, LoginBean.class, false, params); }
public static
Observable<PEArticle>
getArticle
(String articleId) {
HttpParams params = new HttpParams(); params.put("id", articleId); params.put("serviceId", "panda"); return ApiConnection.<PEArticle>createGet() .type(PEArticle.class) .url(ARTICLE_URL) .params(params) .requestCall().observable(); }
2. 封装在内部的框架可被替换成其他的网络请求框架,比如retrofit ,Okhttp, RxVolley
public class HttpTools { public static <T> Call<T> get(String url, Class<T> type, boolean shouldCache, HttpParams params) { return ApiConnection.<T>createGet() .url(url) .params(params) .type(type) .shouldCache(shouldCache) .requestCall(); }3. 下面是从Retrofit中摘出来的一些类,修改部分代码实现自己的接口
4.最里层封装
public class ApiConnection { public static <T> Builder<T> createGet() { return new Builder<T>().method(Method.GET); } public static <T> Builder<T> createPost() { return new Builder<T>().method(Method.POST); } public static class Builder<T> { private String url; private HttpParams params; private boolean shouldCache = true; private int method = Method.GET; private Class<T> type; private int timeoutMs = Network.DEFAULT_TIME_OUT; public Builder() { } public Builder<T> url(String url) { this.url = url; return this; } Builder<T> method(int method) { this.method = method; return this; } public Builder<T> params(HttpParams params) { this.params = params; return this; } public Builder<T> shouldCache(boolean shouldCache) { this.shouldCache = shouldCache; return this; } public Builder<T> type(Class<T> type) { this.type = type; return this; }//使用Okhttp进行数据请求public Call<T> requestCall() {
build();
Call<T> okHttpCall = new OkHttpCall<>(this);
Call call = DaggerCallComponent.builder()
.applicationComponent(AppContext.getInstance().getApplicationComponent())
.callModule(new CallModule(okHttpCall)).build().call();
return call;
}5. Retrofit 转化Rxjava接口
public class RxJavaCallAdapter { public <R> Observable<R> toBody(Call<R> call) { Observable<R> observable = adapt(call) .lift(OperatorMapResponseToBodyOrError.<R>instance()); return observable; } public <R> Observable<Response<R>> adapt(Call<R> call) { Observable<Response<R>> observable = Observable.create(new CallOnSubscribe<>(call)); return observable; }