Retrofit简易封装

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);
    

有问题可私信/评论.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Retrofit与协程的结合,可以通过封装来简化使用和处理异步操作。以下是一个简单的示例: 首先,你可以创建一个协程适配器(CoroutineCallAdapterFactory)并添加到Retrofit的Builder中: ```kotlin val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(CoroutineCallAdapterFactory()) .build() ``` 接下来,你可以定义一个封装了异步操作的协程函数,例如: ```kotlin suspend fun <T> Call<T>.await(): T { return suspendCancellableCoroutine { continuation -> enqueue(object : Callback<T> { override fun onResponse(call: Call<T>, response: Response<T>) { if (response.isSuccessful) { response.body()?.let { continuation.resume(it) } ?: continuation.resumeWithException(NullPointerException("Response body is null")) } else { continuation.resumeWithException(HttpException(response)) } } override fun onFailure(call: Call<T>, t: Throwable) { if (continuation.isCancelled) return continuation.resumeWithException(t) } }) continuation.invokeOnCancellation { try { cancel() } catch (ex: Throwable) { // Ignore cancel exception } } } } ``` 这个函数将一个Retrofit的Call对象转换为一个挂起函数,它会在请求完成时返回结果或抛出异常。 最后,你可以在协程中使用封装后的Retrofit方法,例如: ```kotlin suspend fun fetchData(): List<Item> { val service = retrofit.create(ApiService::class.java) val response = service.getItems().await() return response.items } ``` 这样,你就可以使用协程的方式来发起异步请求并获取结果了。注意,上述代码中的`ApiService`是你自己定义的Retrofit接口。 希望以上示例能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值