Retrofit简易封装

来源:互联网 发布:网络命令ping 编辑:程序博客网 时间:2024/06/08 11:38

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个基本的类:

  1. RetrofitManager
  2. OkHttpClientManager
  3. NetApi
  4. 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);}

最后关于几个需要注意的点:

  1. 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同理.

  2. NetApi中Object常常替换为具体的返回类型,比如:CommonBean之类,而在调用时 onNext() 里就是 CommonBean.

    Observable<CommonBean> onGeoHash(@QueryMap HashMap<String, Object> fields);

有问题可私信/评论.