Retrofit简易封装
简单期间,就用一个demo来展示:
build.gradle配置文件:
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
初次使用 Retrofit 的可以直接复制,修改具体参数,即可使用.
Retrofit简易封装需要以下4个基本的类:
- RetrofitManager
- OkHttpClientManager
- NetApi
- UrlConfig
建议放置在config包中.
RetrofitManager类:
/**
* @author lwj
* @date 2017/12/15
*/
public class RetrofitManager {
private static Retrofit.Builder sInstance;
private static Retrofit.Builder getInstance() {
if (sInstance == null) {
synchronized (RetrofitManager.class) {
if (sInstance == null) {
sInstance = new Retrofit.Builder();
}
}
}
return sInstance;
}
private static Retrofit getRetrofit(String url) {
Retrofit retrofit = RetrofitManager.getInstance()
// 经过处理的okHttpClient
.client(OkHttpClientManager.getInstance().okHttpClient)
// 添加转换工厂.
.addConverterFactory(GsonConverterFactory.create())
// 添加回调适配器工厂
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
// 至此: host+port===>baseUrl
.baseUrl(url)
.build();
return retrofit;
}
public static Retrofit getHost() {
return RetrofitManager.getRetrofit(UrlConfig.HOST);
}
}
OkHttpClientManager类:
/**
* @author lwj
* @date 2017/12/15
*/
public class OkHttpClientManager {
private static final String TAG = OkHttpClientManager.class.getName();
protected OkHttpClient okHttpClient;
private OkHttpClientManager() {
if (okHttpClient == null) {
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
// NONE BASIC HEADERS BODY 四种方式.
// 最后过了调试阶段,就把 BODY ----> NONE
httpLoggingInterceptor.setLevel(BODY);
OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
// 10s 连接超时
okHttpClientBuilder.connectTimeout(10, TimeUnit.SECONDS);
// 5s 读取超时
okHttpClientBuilder.readTimeout(15, TimeUnit.SECONDS);
okHttpClient = okHttpClientBuilder
.addInterceptor(new RequestInterceptor())
.addInterceptor(new CustomInterceptor())
.addInterceptor(httpLoggingInterceptor)
.build();
}
}
public static OkHttpClientManager getInstance() {
return HelpHolder.INSTANCE;
}
private static class HelpHolder {
private static final OkHttpClientManager INSTANCE = new OkHttpClientManager();
}
/**
* ********以下部分为自定义,而且这两个 Interceptor可以在一个当中写.***********************************
*/
private class RequestInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request.newBuilder()
.header("Content-Type", "application/x-www-form-urlencoded")
.method(request.method(), request.body())
.build();
return chain.proceed(request);
}
}
/**
* 自定义拦截器.
*/
private class CustomInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
HttpUrl url = request.url();
request.newBuilder().url(url).build();
return chain.proceed(request);
}
}
}
NetApi类:
/**
* @author lwj
* @date 2017/12/15
*/
public class NetApi {
public static HashMap<String, Object> buildBaseMap() {
HashMap<String, Object> map = new HashMap<>();
// 在这里设置公共参数.
return map;
}
public static HashMap<String, Object> buildGeoHashMap(double lat, double lng) {
HashMap<String, Object> map = buildBaseMap();
map.put("lat", lat);
map.put("lng", lng);
return map;
}
/**
* GEO_HASH
*
* @Body 获取网页 html 代码
* @QueryMap 获取 json 字符串.
*/
public interface OnJqueryBack {
@GET(UrlConfig.GEO_HASH)
Observable<Object> onGeoHash(@QueryMap HashMap<String, Object> fields);
}
public static OnJqueryBack getJqueryBack() {
return RetrofitManager.getHost().create(OnJqueryBack.class);
}
}
UrlConfig类:
/**
* @author lwj
* @date 2017/12/15
*/
public class UrlConfig {
/**
* POST
*/
public static final String HOST = "http://pvmap.pvbao.net/";
public static final String GEO_HASH = "JqueryBack/GeoHash.ashx";
}
最后,给出一个调用的参考:
/**
* 请求 geoHash 接口
*/
private void invokeGeoHash(double lat, double lng) {
HashMap<String, Object> map = NetApi.buildGeoHashMap(lat, lng);
Observable<Object> observable = NetApi.getJqueryBack().onGeoHash(map);
Subscription subscription = observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.filter(new Func1<Object, Boolean>() {
@Override
public Boolean call(Object o) {
return true;
}
})
.subscribe(new Subscriber<Object>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
showToast(e.getMessage());
}
@Override
public void onNext(Object o) {
// 数据回调
}
});
mCompositeSubscription.add(subscription);
}
最后关于几个需要注意的点:
mCompositeSubscription在BaseActivity中如下所示初始化
public class BaseActivity extends FragmentActivity { protected CompositeSubscription mCompositeSubscription = new CompositeSubscription(); @Override protected void onDestroy() { if (mCompositeSubscription != null && !mCompositeSubscription.isUnsubscribed()) { // 订阅 vs 解订阅. mCompositeSubscription.unsubscribe(); // 解掉 签署/订阅. } super.onDestroy(); } }
BaseFragment同理.
NetApi中Object常常替换为具体的返回类型,比如:CommonBean之类,而在调用时 onNext() 里就是 CommonBean.
Observable<CommonBean> onGeoHash(@QueryMap HashMap<String, Object> fields);
有问题可私信/评论.