OkHttp和Retrofit实例
NetworkModule.java
提供OkHttp
和Retrofit
实例
public class NetworkModule {
// 提供OkHttpClient
public static OkHttpClient provideOkHttpClient() { }
// 提供Retrofit实例
public static Retrofit provideRetrofit(OkHttpClient okHttpClient) { }
}
provideOkHttpClient()
方法体
public static OkHttpClient provideOkHttpClient() {
// 初始化okhttp
OkHttpClient.Builder okhttpClientBuilder = new OkHttpClient.Builder();
// 配置缓存。 AppContext.getInstance():需要配置application,提供一个获取实例的方法
Cache cache = new Cache(AppContext.getInstance().getCacheDir(), Config.NETWORK_CACHE_SIZE);
okhttpClientBuilder.cache(cache);
okhttpClientBuilder.connectTimeout(60, TimeUnit.SECONDS) //连接超时时间
.writeTimeout(60, TimeUnit.SECONDS) //写,也就是将数据发送到服务端超时时间
.readTimeout(60, TimeUnit.SECONDS); //读,将服务端的数据下载到本地
// 调试模式。 Config.DEBUG 即:BuildConfig.DEBUG
if (Config.DEBUG) {
// 创建okhttp日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
// 设置日志等级
loggingInterceptor.level(HttpLoggingInterceptor.Level.BASIC);
// 添加到网络框架中
okhttpClientBuilder.addInterceptor(loggingInterceptor);
}
return okhttpClientBuilder.build();
}
provideRetrofit(OkHttpClient okHttpClient)
方法体,需要传入OkHttp
实例
public static Retrofit provideRetrofit(OkHttpClient okHttpClient) {
return new Retrofit.Builder()
// 让retrofit使用okhttp
.client(okHttpClient)
// baseapi地址。Config.ENDPOINT:/archives/5559/
.baseUrl(Config.ENDPOINT)
// 适配rxjava
.addCallAdapterFactory(RxJava3CallAdapterFactory.create())
// 使用gson解析json
// 包括请求参数和响应
.addConverterFactory(GsonConverterFactory.create(JSONUtil.createGson()))
// 创建retrofit
.build();
}
JSONUtil.java
public class JSONUtil {
public static Gson createGson() {
GsonBuilder gsonBuilder = new GsonBuilder();
// 后端返回的create_at 转成 createAt,安卓发送时createAt 转 create_at
gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
return gsonBuilder.create();
}
public static String toJSON(Object data) {
return createGson().toJson(data);
}
/**
* 将Json转为对象
*
* @param data
* @param clazz
* @param <T>
* @return
*/
public static <T> T fromJSON(String data, Class<T> clazz) {
//通过gson转换
return createGson()
.fromJson(data, clazz);
}
}
service接口
一个service方法就是一个请求接口
public interface DefaultService {
// 请求:v1/sheets?category=${Category}&size=${size}
// 这个方法会拼接上在retrofit设置的baseUrl
@GET("v1/sheets")
Observable<JsonObject> sheets(@Query(value = "category") String Category, @Query(value = "size") int size);
}
JsonObject可以改成请求接口数据的模型类,这里直接解析为json字符串,没有转为java模型。
使用
retrofit创建service实例,请求service接口:
private DefaultService service;
...
OkHttpClient okHttpClient = NetworkModule.provideOkHttpClient();
Retrofit retrofit = NetworkModule.provideRetrofit(okHttpClient);
service = retrofit.create(DefaultService.class);
binding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testRetrofitGet();
}
});
/**
* Retrofit Get
*/
private void testRetrofitGet() {
service.sheets(null, 10)
// 网络执行在子线程
.subscribeOn(Schedulers.io())
// 请求完成,观察者在主线程执行(onSubscribe,onNext,onError,onComplete)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<JsonObject>() {
// subscribe调用执行
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.d(TAG, "onSubscribe" );
}
// 请求完成执行
@Override
public void onNext(@NonNull JsonObject jsonObject) {
Log.d(TAG, "onNext" + jsonObject);
}
// 请求失败执行
@Override
public void onError(@NonNull Throwable e) {
Log.d(TAG, "onError" + e.getMessage());
}
// 请求完成不管成功失败都执行
@Override
public void onComplete() {
Log.d(TAG, "onComplete" );
}
});
}
1
1
1
1
1
1
1
1
1
1