一: 首先对api,网络请求类型的封装,我们用到的是Retrofit 的注解,还有不了解的小伙伴可以去Retrofit的介绍
public interface ApiService {
@GET
public Call get1(@Url String url);
@GET
public Observable get(@Url String url);
@GET
public Observable get(@Url String url, @QueryMap Map map);
@FormUrlEncoded
@POST
public Observable post(@Url String url, @FieldMap Map map);
//上传图片
@Multipart
@POST("s=Upload/upload")
Observable uploadPhoto(@Part("sfile") MultipartBody file);
}
二:其次我们写一个retrofit 的管理类,用来调用不同的网络请求
public class RetrofitManager {
// 用不到可以不写
// private static OkHttpClient okHttpClient = new OkHttpClient.Builder()
// .cookieJar(new CookiesManager(IApplication.application))
// .connectTimeout(20, TimeUnit.SECONDS)
// .readTimeout(20,TimeUnit.SECONDS)
// .writeTimeout(20,TimeUnit.SECONDS)
// .addNetworkInterceptor(new LoggingInterceptor())//自定义的日志拦截器
// .build();
private static ApiService apiService = new Retrofit.Builder()
.baseUrl("这里写上项目中用到的ip")
.addConverterFactory(ScalarsConverterFactory.create())
// .client(okHttpClient)
//把 以前的 call 转化成 Observable
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//也是Rxjava与retrofit 的关联
.build().create(ApiService.class);
public static void get(String url, Observer observer) {
apiService.get(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//切换线程
.subscribe(observer);
}
public static void get(String url, Map map, Observer observer) {
apiService.get(url, map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public static void post(String url, Map map, Observer observer) {
// SortUtils.sortString(map) mao key 排序
// SortUtils.getMapResult(map) map 拼接成字符串 返回值string
// JNICore.getSign(string) md5(appkey=11111&string)
//
// String sign = JNICore.getSign(SortUtils.getMapResult(SortUtils.sortString(map))) ;
// map.put("user.sign",sign);
apiService.post(url, map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public static void uploadPhoto(MultipartBody multipartBody, Observer observer) {
apiService.uploadPhoto(multipartBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
三:我们需要一个公用的解析类
public abstract class BaseObserver1 implements Observer {
/**
* 项目框架搭建
* 1 通用模块的封装 1 共用UI 2 父类定义方法 子类实现
* 2 通用网络请求模块 定义错误编码
* 3 常用工具类的封装
* 4 basemvpactivity basemvpfragment
* 5 主框架页面结构
* 6 fragment 切换 通用
* 7 rxjava retrofit mvp
*
* @param d
*/
private String tag;
public BaseObserver1(String tag) {
this.tag = tag;
}
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
try {
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
Class entityClass = (Class) params[0];
T t = (T) JSON.parseObject(s, entityClass);
KLog.e(s);
onSuccess(t, tag);
} catch (Exception e) {
onFailed(JSON_FORMAT_ERROR);
e.printStackTrace();
}
}
@Override
public void onError(@NonNull Throwable e) {
try {
if (e != null) {
if (e instanceof HttpException) {
onFailed(HTTP_ERROR);
} else if (e instanceof SocketException) {
onFailed(NET_WORK_ERROR);
} else {
onFailed(UNKNOW_ERROR);
}
} else {
onFailed(UNKNOW_ERROR);
}
e.printStackTrace();
System.out.println();
KLog.i(e);
} catch (Exception e1) {
onFailed(UNKNOW_ERROR);
e1.printStackTrace();
}
}
@Override
public void onComplete() {
}
public abstract void onSuccess(T result, String tag) throws RemoteException;
/**
* code
* 1000 UNKNOW_ERROR 未知错误
* 1001 json 转化异常 parse error
* 1002 当前网络不可用 java.net.SocketException: Network is unreachable 超时
* 1003 服务器不可用 401 402 403 500 502 503 504
*
* @param code
*/
public abstract void onFailed(int code);
public static final int UNKNOW_ERROR = 1000;
public static final int JSON_FORMAT_ERROR = 1001;
public static final int NET_WORK_ERROR = 1002;
public static final int HTTP_ERROR = 1003;
// HttpException 都属于 http exception
// private static final int UNAUTHORIZED = 401;
// private static final int FORBIDDEN = 403;
// private static final int NOT_FOUND = 404;
// private static final int REQUEST_TIMEOUT = 408;
// private static final int INTERNAL_SERVER_ERROR = 500;
// private static final int BAD_GATEWAY = 502;
// private static final int SERVICE_UNAVAILABLE = 503;
// private static final int GATEWAY_TIMEOUT = 504;
}
完成以上三部,我们就对Rxjava与Retrofit 进行了一个基本的简单封装.。掉用方法如下:
1:url 2:拼接参数 3:new 观察者 loginbean就是解析的实体bean
RetrofitManager.post(MyContants.BASEURL + "s=Login/login", map, new BaseObserver1("") {
@Override
public void onSuccess(Loginbean result, String tag) {
if(result.getCode()==200){
Loginbean.DatasBean datas = result.getDatas();//result 返回解析的结果
}
}
@Override
public void onFailed(int code) {
ToastUtils.show(LoginActivitys.this,code+"",1);
}
});
}
是不是很简单呢,啊哈哈!!!!