(一)封装
RetrofitManager
public class RetrofitManager {
//OkHttp-- 30秒内直接读缓存
private static final long HAVA_NET_MAX = 30; //30秒 有网超时时间
//OkHttp--设置链接与写入超时时间
private static final int CONNECT_TIMEOUT = 10;
//定义同步的OkHttpClient
private static volatile OkHttpClient sOkHttpClient = null;
//定义RetrofitManager
private static RetrofitManager mInstance = null;
//定义NetRequestFactory
private final NetRequestService mNetRequestService;
// 配置OkHttpClient
private OkHttpClient getOkHttpClient() {
if (sOkHttpClient == null) {
synchronized (RetrofitManager.class) {
if (sOkHttpClient == null) {
//创建OkHttpClient并配置
sOkHttpClient = new OkHttpClient.Builder()
.cache(initOkHttpCache()) //配置缓存
.addNetworkInterceptor(new NetCacheInterceptor(App.getContext())) //添加网络拦截器
.retryOnConnectionFailure(true)
.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
.readTimeout(HAVA_NET_MAX, TimeUnit.SECONDS)
.build();
}
}
}
return sOkHttpClient;
}
//配置okhttp缓存
private Cache initOkHttpCache() {
int cacheSize = 1024 * 1024 * 30; //缓存大小30Mb
//储存目录 指定缓存路径
File directoryFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/okHttpCache");
return new Cache(directoryFile, cacheSize);
}
//创建及配置Retrofit
private RetrofitManager() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("url")
.client(getOkHttpClient()) //设置自定义配置的OkHttpClient
.addConverterFactory(GsonConverterFactory.create()) //添加json解析
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //添加RxJava2的适配
.build();
mNetRequestService = retrofit.create(NetRequestService.class);
}
//获取retrofit
public static RetrofitManager getRetrofit() {
if (mInstance == null) {
synchronized (RetrofitManager.class) {
if (mInstance == null) {
mInstance = new RetrofitManager();
}
}
}
return mInstance;
}
/**
* 1.登录
*/
public Observable<UserInfoBean> login(String userName, String password) {
return mNetRequestService.login(userName, password)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io());
}
/**
* 2.获取联系人
*/
public Observable<ContactBean> contactGet(String userName, String token) {
return mNetRequestService.getContactData(userName, token)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io());
} //..... }
(二)网络操作的接口
public interface NetRequestService {
// @GET("android.json")
// Observable<ApkUpdateInfo> checkUpdateAPK();
/**
* 登录
*
* @param userName 用户名
* @param password 密码
* @return
*/
@POST("ac/login")
@FormUrlEncoded
Observable<UserInfoBean> login(@Field("username") String userName, @Field("password") String password);
/**
* 获取联系人
*
* @param userName 用户名
* @param token XCSRFToken
* @return
*/
@GET("info/user_list?")
Observable<ContactBean> getContactData(@Query("uname") String userName, @Header("X-CSRFToken") String token);}
(三)调用
RetrofitManager.getRetrofit()
.login(getText(mEtUserName), getText(mEtPassword))
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(userInfoBean -> {
//......
})
.subscribe(new Observer<UserInfoBean>() {
@Override
public void onSubscribe(Disposable d) {
mProgressBar.setVisibility(View.VISIBLE);
}
@Override
public void onNext(UserInfoBean value) {
if (TextUtils.isEmpty(value.getXCSRFToken())) {
ToastUtils.showShortToast("用户名或密码验证错误");
} else {
ToastUtils.showShortToast("登录成功");
SpUtils.putBoolean(IS_TOKEN_INVALID_KEY,true);
startActivity(new Intent(LoginActivity.this, MainActivity.class));
finish();
}
}
@Override
public void onError(Throwable e) {
ToastUtils.showShortToast("请求失败");
}
@Override
public void onComplete() {
mProgressBar.setVisibility(View.INVISIBLE);
}
});