retrofit 响应时间_Retrofit 同时支持多个 BaseUrl ,为每个BaseUrl配置不同的拦截器,每个BaseUr配置多个拦截器...

本文介绍了一个名为XRetrofit的自定义网络请求库,它提供接口配置、单例管理和线程调度等功能,支持Gson转换及默认使用RxJava2。通过实例代码展示了如何创建Retrofit实例、注册配置提供者并清理缓存。
摘要由CSDN通过智能技术生成

package com.msy.xretrofit;

import com.msy.xretrofit.interfaces.IModel;

import com.msy.xretrofit.interfaces.NetConfigProvider;

import com.msy.xretrofit.interfaces.RequestInterceptorHandler;

import org.reactivestreams.Publisher;

import java.util.HashMap;

import java.util.Map;

import java.util.concurrent.TimeUnit;

import io.reactivex.Flowable;

import io.reactivex.FlowableTransformer;

import io.reactivex.Scheduler;

import io.reactivex.android.schedulers.AndroidSchedulers;

import io.reactivex.functions.Function;

import io.reactivex.schedulers.Schedulers;

import okhttp3.Interceptor;

import okhttp3.OkHttpClient;

import retrofit2.Retrofit;

import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import retrofit2.converter.gson.GsonConverterFactory;

public class XRetrofit {

private static NetConfigProvider sProvider = null;

private Map providerMap = new HashMap<>();

private Map retrofitMap = new HashMap<>();

private Map clientMap = new HashMap<>();

public static final long connectTimeoutMills = 10 * 1000L;

public static final long readTimeoutMills = 10 * 1000L;

//私有构造

private XRetrofit() {

}

//静态内部类获取单例

public static XRetrofit getInstance() {

return SingletonHolder.sXRetrofit;

}

/**

* 内部类

*/

private static class SingletonHolder {

private static XRetrofit sXRetrofit = new XRetrofit();

}

public static S get(String baseUrl, Class service) {

return getInstance().getRetrofit(baseUrl).create(service);

}

public static void registerProvider(NetConfigProvider provider) {

sProvider = provider;

}

public static void registerProvider(String baseUrl, NetConfigProvider provider) {

getInstance().providerMap.put(baseUrl, provider);

}

/**

* 默认使用rxjava

*

* @param baseUrl

* @return

*/

public Retrofit getRetrofit(String baseUrl) {

return getRetrofit(baseUrl, null, true);

}

/**

* 必须默认手动注册

*

* @param baseUrl

* @param useRx

* @return

*/

public Retrofit getRetrofit(String baseUrl, boolean useRx) {

return getRetrofit(baseUrl, null, useRx);

}

public Retrofit getRetrofit(String baseUrl, NetConfigProvider configProvider, boolean useRx) {

if (baseUrl == null || baseUrl.length() == 0) {

throw new IllegalStateException("base url can not be null!");

}

if (retrofitMap.get(baseUrl) != null) {

return retrofitMap.get(baseUrl);

}

//添加一个默认的配置 否则抛出异常

if (configProvider == null) {

configProvider = providerMap.get(baseUrl);

if (configProvider == null) {

configProvider = sProvider;

}

}

checkProvider(configProvider);

Retrofit.Builder builder = new Retrofit.Builder();

builder.baseUrl(baseUrl);

OkHttpClient okHttpClient = getClient(baseUrl, configProvider);

builder.client(okHttpClient);

builder.addConverterFactory(GsonConverterFactory.create());

if (useRx) {

builder.addCallAdapterFactory(RxJava2CallAdapterFactory.create());

}

Retrofit retrofit = builder.build();

retrofitMap.put(baseUrl, retrofit);

providerMap.put(baseUrl, configProvider);

clientMap.put(baseUrl, okHttpClient);

return retrofit;

}

private OkHttpClient getClient(String baseUrl, NetConfigProvider provider) {

if (baseUrl == null || baseUrl.length() == 0) {

throw new IllegalArgumentException("base url can not be null!");

}

if (clientMap.get(baseUrl) != null) {

return clientMap.get(baseUrl);

}

OkHttpClient.Builder builder = new OkHttpClient.Builder();

builder.connectTimeout(provider.configConnectTimeoutMills() == 0 ? connectTimeoutMills : provider.configConnectTimeoutMills(), TimeUnit.MILLISECONDS);

builder.readTimeout(provider.configReadTimeoutMills() == 0 ? readTimeoutMills : provider.configReadTimeoutMills(), TimeUnit.MILLISECONDS);

//添加通用拦截器

RequestInterceptorHandler requestInterceptorHandler = provider.configHandler();

if (requestInterceptorHandler != null) {

builder.addInterceptor(new XInterceptor(requestInterceptorHandler));

}

//配置每个主机对应的拦截器 每个host对应的拦截器数目不定

Interceptor[] interceptors = provider.interceptors();

if (interceptors != null && interceptors.length != 0) {

for (Interceptor interceptor : interceptors) {

builder.addInterceptor(interceptor);

}

}

//添加日志拦截器

if (provider.configLogEnable()) {

LogInterceptor logInterceptor = new LogInterceptor();

builder.addInterceptor(logInterceptor);

}

OkHttpClient client = builder.build();

return client;

}

private void checkProvider(NetConfigProvider provider) {

if (provider == null) {

throw new IllegalArgumentException("must register provider first");

}

}

//清除缓存

public static void clearCache() {

getInstance().retrofitMap.clear();

getInstance().clientMap.clear();

}

/**

* 线程切换

*

* @param

* @return

*/

public static FlowableTransformer getScheduler() {

return new FlowableTransformer() {

@Override

public Publisher apply(Flowable upstream) {

return upstream.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread());

}

};

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值