使用效果
NetWork.getInstance().doLogin(userName, password, new NetBackListener<ResLogin>() {
@Override
public void onError(String msg) {
}
@Override
public void onSuccess(ResLogin data) {
jumpActivityAndFinish(MainActivity.class);
}
@Override
public void onEmpty() {
}
});
封装后代码结构清晰,日后更换网络框架只需要更改 NetWork 中的 代码。
导入框架
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.2'
implementation 'com.squareup.okhttp3:okhttp:3.12.2'
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'
封装 HttpClient
public class HttpClient {
// 接口根地址 你的地址
String BASE_URL = ;
// 默认的超时时间
public static final int DEFAULT_MILLISECONDS = 60000;
//okhttp请求的客户端
private OkHttpClient.Builder okHttpClientBuilder;
//Retrofit请求Builder
private Retrofit.Builder retrofitBuilder;
public HttpClient() {
// onhttpclient
okHttpClientBuilder = new OkHttpClient.Builder()
.connectTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
.readTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
.writeTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
// 这里你可以根据自己的机型设置同时连接的个数和时间,我这里8个,和每个保持时间为10s
.connectionPool(new ConnectionPool(8, 15, TimeUnit.SECONDS))
;
// 添加 token 拦截器
okHttpClientBuilder.addInterceptor(new TokenInterceptor());
// 正式版本则不打印日志
if (BuildConfig.DEBUG) {
okHttpClientBuilder.addInterceptor(new HttpLoggingInterceptor(
new LogIntercepor()).setLevel(HttpLoggingInterceptor.Level.BODY));
}
// retrofit
retrofitBuilder = new Retrofit.Builder()
.client(okHttpClientBuilder.build())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl(Constant.BASE_URL)
;
}
/**
* 获取Retrofit
*
* @return Retrofit
*/
public Retrofit getRetrofit() {
return retrofitBuilder.build();
}
}
日志、Token拦截器
public class TokenInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
//获取 你自己的token
String token = ;
if (!TextUtils.isEmpty(token)) {
builder.header("token", token);
}
return chain.proceed(builder.build());
}
}
public class LogIntercepor implements HttpLoggingInterceptor.Logger {
@Override
public void log(String message) {
// try {
// Log.d("--网络请求日志--", URLDecoder.decode(message, "utf-8"));
// } catch (UnsupportedEncodingException e) {
// e.printStackTrace();
// Log.d("--网络请求日志--", message);
//
// }
// 日志
Log.d("--网络请求日志--", message);
}
定义接口 NetBackListener
public interface NetBackListener<T> {
/**
* 错误回调
* @param msg 消息
*/
void onError(String msg);
/**
* 成功回调
* @param data 数据
*/
void onSuccess(T data);
/**
* 成功,数据为空
*/
void onEmpty();
}
构建 ApiService
interface ApiService {
//登录
@GET("你的 login 地址")
Observable<ResBean<ResLogin>> doLogin(@Query("userName") String username,
@Query("passWord") String password);
封装 NetWork
public class NetWork {
private static NetWork netWork;
private static ApiService apiService;
private static final int SUCCESS_CODE = 200;
public static NetWork getInstance() {
if (netWork == null) {
synchronized (NetWork.class) {
if (netWork == null) {
netWork = new NetWork();
// 初始化 HttpClient
HttpClient httpClient = new HttpClient();
// 服务接口
apiService = httpClient.getRetrofit().create(ApiService.class);
}
}
}
return netWork;
}
//登录 示例
public void doLogin(String userName, String password, NetBackListener<ResLogin> listener) {
apiService.doLogin(userName, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new NetObserver<ResBean<ResLogin>>() {
@Override
protected void onSuccess(ResBean<ResLogin> data) {
if (data.code == SUCCESS_CODE) {
if (data.data == null) {
listener.onEmpty();
} else {
listener.onSuccess(data.data);
}
} else {
listener.onError(data.msg);
}
}
@Override
protected void onFailure(String failureMsg) {
listener.onError(failureMsg);
}
});
}
}
封装数据返回 Bean
public class ResBean<T> {
public String msg;
public int code;
public T data;
}
public class ResLogin {
// 你自己的 login 返回 data 的内容
}
至此 ,retrofit2 + rxjava2 简单封装结束。
版权声明:本文为weixin_43502791原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。