Retrofit2+OkHttp3+RxJava搭建网络框架
首先封装一个获取Retrofit,并集成0kHttp3的抽象基类
public abstract class RetrofitUtils {
private static final String API_SERVER =
"http://192.168.16.147:8080";
private static Retrofit mRetrofit;
private static OkHttpClient mOkHttpClient;
/**
* 获取Retrofit对象
*
* @return
*/
protected static Retrofit
getRetrofit() {
if (
null == mRetrofit) {
if (
null == mOkHttpClient) {
mOkHttpClient = OkHttp3Utils.getOkHttpClient();
}
mRetrofit =
new Retrofit.Builder()
.baseUrl(API_SERVER +
"/")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(mOkHttpClient)
.build();
}
return mRetrofit;
}
}
123456789101112131415161718192021222324252627282930313233
123456789101112131415161718192021222324252627282930313233
从Retrofit升级到2.0之后,就使用了build设计模式(生产者模式),将一个复杂的构建与其表示相分离。
baseUrl(API_SERVER + “/”):设置服务器路径addConverterFactory(GsonConverterFactory.create()):添加转化库,默认是GsonaddCallAdapterFactory(RxJavaCallAdapterFactory.create()):添加回调库,采用RxJavaclient(mOkHttpClient):设置使用okhttp网络请求
设置服务器就不多说了,是为了方便大家管理。添加转化库,为了能把网络数据直接解析成我们想要的javabeam,方便操作。添加回调库,这里采用的是RxJava,关于为什么使用RxJava,大家网上一搜就知道了,我就不多说啥了。最后是设置okhttp为网络请求,okhttp是高性能的http库,拥有队列线程池,轻松解决并发,自动维护socket连接池,所以这里使用okhttp可谓是更上一层楼。
然后就是要设置OkHttpClient请求的
public class OkHttp3Utils {
private static OkHttpClient mOkHttpClient;
private static File cacheDirectory =
new File(MyApplication.getInstance().getApplicationContext().getCacheDir().getAbsolutePath(),
"MyCache");
private static Cache cache =
new Cache(cacheDirectory,
10 *
1024 *
1024);
/**
* 获取OkHttpClient对象
*
* @return
*/
public static OkHttpClient
getOkHttpClient() {
if (
null == mOkHttpClient) {
mOkHttpClient =
new OkHttpClient.Builder()
.cookieJar(
new CookiesManager())
.connectTimeout(
10, TimeUnit.SECONDS)
.writeTimeout(
30, TimeUnit.SECONDS)
.readTimeout(
30, TimeUnit.SECONDS)
.cache(cache)
.build();
}
return mOkHttpClient;
}
}
1234567891011121314151617181920212223242526272829303132
1234567891011121314151617181920212223242526272829303132
同样升级到okhttp3后,也使用build设计模式。
cookieJar(new CookiesManager()): 设置一个自动管理cookies的管理器addInterceptor(new MyIntercepter()):添加拦截器 addNetworkInterceptor(newCookiesInterceptor(MyApplication.getInstance().getApplicationContext())):添加网络连接器connectTimeout(30, TimeUnit.SECONDS):请求超时时间 writeTimeout(30,TimeUnit.SECONDS):写入超时时间 readTimeout(30, TimeUnit.SECONDS):读取超时时间
OkHttp相信已经有好多人都在用它了,我就不多说什么了。
前面两部做完了现在就可以使用了。
public class NetWorks extends RetrofitUtils {
protected static final NetService service = getRetrofit().create(NetService.class);
protected static final long CACHE_STALE_SEC =
60 *
60 *
24 *
1;
protected static final String CACHE_CONTROL_CACHE =
"only-if-cached, max-stale=" + CACHE_STALE_SEC;
protected static final String CACHE_CONTROL_NETWORK =
"max-age=0";
private interface NetService {
@FormUrlEncoded
@POST(
"bjws/app.user/login")
Observable<Verification> getVerfcationCodePost(
@Field(
"tel") String tel,
@Field(
"password") String pass);
@FormUrlEncoded
@POST(
"bjws/app.user/login")
Observable<Verification> getVerfcationCodePostMap(
@FieldMap Map<String, String> map);
@GET(
"bjws/app.user/login")
Observable<Verification> getVerfcationGet(
@Query(
"tel") String tel,
@Query(
"password") String pass);
@Headers(
"Cache-Control: public," + CACHE_CONTROL_CACHE)
@GET(
"bjws/app.user/login")
Observable<Verification> getVerfcationGetCache(
@Query(
"tel") String tel,
@Query(
"password") String pass);
@Headers(
"Cache-Control: public," + CACHE_CONTROL_NETWORK)
@GET(
"bjws/app.menu/getMenu")
Observable<MenuBean> getMainMenu();
}
public static void verfacationCodePost(String tel, String pass,Observer<Verification> observer){
setSubscribe(service.getVerfcationCodePost(tel, pass),observer);
}
public static void verfacationCodePostMap(Map<String, String> map,Observer<Verification> observer) {
setSubscribe(service.getVerfcationCodePostMap(map),observer);
}
public static void verfacationCodeGetCache(String tel, String pass,Observer<Verification> observer) {
setSubscribe(service.getVerfcationGetCache(tel, pass),observer);
}
public static void verfacationCodeGet(String tel, String pass,Observer<Verification> observer) {
setSubscribe(service.getVerfcationGet(tel, pass),observer);
}
public static void verfacationCodeGetsub(String tel, String pass, Observer<Verification> observer) {
setSubscribe(service.getVerfcationGet(tel, pass),observer);
}
public static void Getcache( Observer<MenuBean> observer) {
setSubscribe(service.getMainMenu(),observer);
}
public static <T>
void setSubscribe(Observable<T> observable, Observer<T> observer) {
observable.subscribeOn(Schedulers.io())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
接口已经创建出来了,Retrofit是用注解来完成设置的,要访问的url,请求方式,请求头。 常用的注解: @GET GET请求方式 @POST POST请求方式 @Query GET请求参数 @Header用来添加Header请求头 @FormUrlEncoded post请求头标示 其他注解请求方式: @PUT 表示这是一个PUT请求 @DELETE 表示这是一个DELETE请求 @HEAD 表示这是一个HEAD请求 @OPTIONS 表示这是一个OPTION请求 @PATCH 表示这是一个PAT请求
把网络接口统一放到一个接口类中,让Retrofit创建实现接口来方便调用。setSubscribe方法其实就是插入观察者。
最后就是在activity中调用。
public class MainActivity extends AppCompatActivity {
private TextView mTv,mTv2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv =(TextView) findViewById(R.id.main_tv);
mTv2 =(TextView) findViewById(R.id.main_tv2);
NetWorks.verfacationCodePost(
"15910435235",
"123456",
new Observer<Verification>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
mTv.setText(e.getLocalizedMessage());
Log.e(
"MAIN2",e.getLocalizedMessage()+
"--"+e.getMessage());
}
@Override
public void onNext(Verification verification) {
mTv.setText(verification.getUser().toString());
}
});
NetWorks.Getcache(
new Observer<MenuBean>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
mTv2.setText(e.getLocalizedMessage());
Log.e(
"MAIN2",e.getLocalizedMessage()+
"--"+e.getMessage());
}
@Override
public void onNext(MenuBean baseBean) {
mTv2.setText(baseBean.toString());
}
});
}
}
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
使用也挺方便,直接调用请求方法,把参数和观察者传入就可以了。成功之后直接返回自己所需要的bean对象,而且还能对异常处理,比如404,405,500都能自己去处理。 源码下载地址:源码地址