Retrofit和Okhttp和RxJava的封装
导入依赖
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.7'
compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
compile 'com.google.code.gson:gson:2.8.2'
compile 'com.squareup.okhttp3:okhttp:3.9.0'
加入权限
<uses-permission android:name="android.permission.INTERNET" />
先写几个公共的封装类
retrofit的封装类
public class RetrofitUtils {
private static IGetService service = null;
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//单例模式
public static IGetService getInstance(){
if(service==null){
synchronized (RetrofitUtils.class){
if(service==null){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com")
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(OkHttpUtils.getInstance())
.build();
service = retrofit.create(IGetService.class);
}
}
}
return service;
}
}
okhttp的封装类
public class OkHttpUtils {
private static OkHttpClient client = null;
public static OkHttpClient getInstance(){
if(client==null){
synchronized (OkHttpUtils.class){
if(client==null){
client = new OkHttpClient.Builder()
.connectTimeout(2000, TimeUnit.SECONDS)
.writeTimeout(2000,TimeUnit.SECONDS)
.readTimeout(2000,TimeUnit.SECONDS)
.addInterceptor(new LoggingInterceptor())
.addInterceptor(new CommonHeaderInterceptor())
.build();
}
}
}
return client;
}
}
LoggingInterceptor日志拦截器的封装
public class LoggingInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(" this request url "+response.request().url()+" "+(t2-t1)/1000000);
return response;
}
}
CommonHeaderInterceptor公共的请求头拦截器
public class CommonHeaderInterceptor implements Interceptor{
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request.Builder builder = request.newBuilder();
builder.addHeader("key","aa");
builder.addHeader("User-Agent","android");
return chain.proceed(builder.build());
}
}
观察者Observer的封装
//观察者的封装
public abstract class AbstractObserver<T> implements Observer<String> {
//不需要下面重写的四个方法,只需要自己写的两个抽象方法
public abstract void onSuccess(T t);
public abstract void onFailure();
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String result) {
//这里的s是请求网络传回来的string字符串
Type type = getClass().getGenericSuperclass();
Type[] types = ((ParameterizedType) type).getActualTypeArguments();
Class clazz = (Class) types[0];//强转成类对象
//使用gson解析
Gson gson = new Gson();
T t = (T) gson.fromJson(result,clazz);
//调用抽象方法onSuccess
onSuccess(t);
}
@Override
public void onError(Throwable e) {
onFailure();
}
@Override
public void onComplete() {
}
}
Retrofit的接口
public interface IGetService {
/* @GET("/nba")
Observable<Bean> get(@QueryMap Map<String,String> map);*/
//-----------------------下面用于封装的请求
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//返回string字符串的请求方法,传后面整个url
@GET
Observable<String> get1(@Url String url);//重载
@GET
Observable<String> get1(@Url String url,@QueryMap Map<String,String> map);
@FormUrlEncoded
@POST
Observable<String> post1(@Url String url, @FieldMap Map<String,String> map);
@POST
Observable<String> post1(@Url String url);
}
APIFactory.java这个类里面有对应的四个方法get1, post1
public class APIFactory {
//单例模式
private static APIFactory factory = null;
public static APIFactory getInstance(){
if(factory==null){
synchronized (APIFactory.class){
if(factory==null){
factory = new APIFactory();
}
}
}
return factory;
}
//这里面写方法.
public void get1(String url, Map<String,String> map, Observer<String> observer){
//调用retrofit工具类的方法
RetrofitUtils.getInstance().get1(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void get1(String url,Observer<String> observer){
RetrofitUtils.getInstance().get1(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void post1(String url,Map<String,String> map,Observer<String> observer){
RetrofitUtils.getInstance().post1(url,map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void post1(String url,Observer<String> observer){
RetrofitUtils.getInstance().post1(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
在model层里面调用APIFactory里面的4个方法get1,post1,
//具体的model层
public class LoginModelImpl {
//model层处理数据,请求网络
public void getData(final LoginModelCallBack loginModelCallBack) {
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
Map<String,String> map = new HashMap<>();
map.put("key","71e58b5b2f930eaf1f937407acde08fe");
map.put("num","10");
/* Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.tianapi.com")
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
IGetService service = retrofit.create(IGetService.class);
service.get(map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Bean>() {
@Override
public void accept(Bean bean) throws Exception {
loginModelCallBack.success(bean);
}
});*/
//------------
//http://api.tianapi.com/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10
//调用apifactory
//传参map集合
APIFactory.getInstance().get1("/nba", map, new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
// System.out.println("beanget传参 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
// System.out.println("异常了");
}
});
//不传参,直接传路径
APIFactory.getInstance().get1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
// System.out.println("beanget不传参 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
// System.out.println("异常了");
}
});
//不传参直接传路径post
APIFactory.getInstance().post1("/nba/?key=71e58b5b2f930eaf1f937407acde08fe&num=10", new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
System.out.println("beanpost不带参数 ="+bean.getNewslist().toString());
loginModelCallBack.success(bean);
}
@Override
public void onFailure() {
System.out.println("异常了");
}
});
/* //传参 post路径,不好使
APIFactory.getInstance().post1("/nba", map, new AbstractObserver<Bean>() {
@Override
public void onSuccess(Bean bean) {
System.out.println("beanpost带参数 ="+bean.getNewslist().toString());
}
@Override
public void onFailure() {
System.out.println("异常了");
}
});*/
}
}