RXjava+Retrofit的封裝
阿新 • • 發佈:2018-12-28
- Rxjava+retrofit已經用了很久了,網上的講解也是一大堆。但都是大同小異。為此我也不多說一些廢話了,就把自己專案中用到的,和理解的跟大家分享一下。小白帶大家走走,瞧瞧:
## 用到的依賴 ##
//fastjson
compile ‘com.alibaba:fastjson:1.1.62.android’
//網路
compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’
compile ‘io.reactivex.rxjava2:rxjava:2.1.0’
compile ‘com.squareup.retrofit2:retrofit:2.3.0’
compile ‘com.squareup.retrofit2:converter-scalars:+’
compile ‘com.squareup.retrofit2:adapter-rxjava2:2.3.0’
一: 首先對api,網路請求型別的封裝,我們用到的是Retrofit 的註解,還有不瞭解的小夥伴可以去Retrofit的介紹
public interface ApiService {
@GET
public Call<String> get1(@Url String url);
@GET
public Observable<String> get(@Url String url);
@GET
public Observable<String> get(@Url String url, @QueryMap Map<String, String> map);
@FormUrlEncoded
@POST
public Observable<String> post(@Url String url, @FieldMap Map<String, String> map);
//上傳圖片
@Multipart
@POST("s=Upload/upload")
Observable<String> 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<String> observer) {
apiService.get(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())//切換執行緒
.subscribe(observer);
}
public static void get(String url, Map<String, String> map, Observer<String> observer) {
apiService.get(url, map).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public static void post(String url, Map<String, String> map, Observer<String> 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<String> observer) {
apiService.uploadPhoto(multipartBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
三:我們需要一個公用的解析類
public abstract class BaseObserver1<T> implements Observer<String> {
/**
* 專案框架搭建
* 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<Loginbean>("") {
@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);
}
});
}
是不是很簡單呢,啊哈哈!!!!