嘿,今天的你过的还好吗
最近想系统看看动态代理的东西,然后查各种文章,最后不是用不了的,就是一片一片的,无奈之下,动手操作
历经一天的时间成功的明白了他的简单使用流程,以后可以牛逼的说我会用Retorfit2 + RXjava了.
也因为这个是简单使用,我也就不说封装的事情了,以后有时间在更新封装.主要就是能用就完事
按照惯例,我们需要引包,当然,根据最新的来
implementation "io.reactivex.rxjava2:rxjava:2.1.0" // 必要rxjava2依赖
implementation 'com.squareup.retrofit2:retrofit:2.3.0' // 必要retrofit依赖
implementation "io.reactivex.rxjava2:rxandroid:2.0.1" // 必要rxandrroid依赖,切线程时需要用到
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' // 必要依赖,和Rxjava结合必须用到,下面会提到
implementation 'com.squareup.retrofit2:converter-gson:2.3.0' // 必要依赖,解析json字符所用
引包结束,开始无尽的折磨模式 首先需要一个接口,名字因人我的叫 APIService 我先冲了 你们随意
网上教程都是get,我就用post
public interface APIService {
@POST("pi.User.getPratique.hf")
@FormUrlEncoded
Call<Object> getPratique(@Field("AppType") String AppType, @Field("SystemID") String SystemID, @Field("LoginKey") String LoginKey);
@POST("pi.User.getPratique.hf")
Call<BaseResult<MassageBean>> getPratique(@Body CurrencyBean currencyBean);
@POST("pi.User.getPratique.hf")
Observable<BaseResult<MassageBean>> getPratiques(@Body CurrencyBean currencyBean);
}
这里代码注意一下,Call<Object> Call<BaseResult<MassageBean>> Observable<BaseResult<MassageBean>>
这是三种情况,理论还可以有第四种自己推着看一下就行了
BaseResult : 这就是一个第一层json的bean
public class BaseResult<T> {
private Boolean Result; // 返回的Result
private T Data; // 具体的数据结果
private String Notice; // Notice可用来返回接口的说明
public Boolean getResult() {
return Result;
}
public void setResult(Boolean result) {
Result = result;
}
public T getData() {
return Data;
}
public void setData(T data) {
Data = data;
}
public String getNotice() {
return Notice;
}
public void setNotice(String notice) {
Notice = notice;
}
}
MassageBean: 这个是我个人习惯了,直接返回JavaBean,这里就是javaBean...因数据而异就不贴代码了
Call<Object> 最基本用法,传值就完了,官方用法
Call<BaseResult<MassageBean>> Call<Object>升级版,直接就解析第一层json,能方便一些
Observable<BaseResult<MassageBean>> 这个是引用RxJava的情况,我就都放在一块了
ok 现在我们接口和地址有了,针不戳,我们就该去使用Retorfit了
我就直接在MainActivity中用了
我写了两个实例 一个是Call<BaseResult<MassageBean>> 一个是Observable<BaseResult<MassageBean>>
首先是Call<BaseResult<MassageBean>> 情况
String baseUrl = "你得接口网址"
Retrofit retrofit = new Retrofit.Builder()
//设置网络请求BaseUrl地址
.baseUrl(baseUrl)
//设置数据解析器
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService mAPIService = retrofit.create(APIService.class);
CurrencyBean currencyBean = new CurrencyBean();
currencyBean.setAppType("2");
currencyBean.setLoginKey("9527");
currencyBean.setSystemID("2");
mAPIService.getPratique(currencyBean)
.enqueue(new Callback<BaseResult<MassageBean>>() {
@Override
public void onResponse(Call<BaseResult<MassageBean>> call, Response<BaseResult<MassageBean>> response) {
BaseResult<MassageBean> body = response.body();
tvContent.setText(body.getData().getDengLu().get(0).getBusinessName() + "");
Log.i("sansuiban", "onResponse: " + body.getNotice());
}
@Override
public void onFailure(Call<BaseResult<MassageBean>> call, Throwable t) {
Log.e("sansuiban", "post回调失败:" + t.getMessage() + "," + t.toString());
}
});
如此,这个情况完成.....
啊对,之前忘了说 @Body CurrencyBean currencyBean 这个是放一个实体类进去,请求体,你也可以直接放参数,我这纯粹是个人习惯
至此,这个基本用法完事,完结撒花
怎么可能,第二种情况,引入RxJava的情况,我看了一下网上大部分教程就是引进去就完事了.确实是这么回事,但是有一点使用观察者模式时候io会延迟....也可能是我网络问题,这个问题没解决,先记录下来
然后Observable<BaseResult<MassageBean>> 情况
Retrofit retrofit = new Retrofit.Builder()
//设置网络请求BaseUrl地址
.baseUrl("https://west.shidongvr.com/cdnmpi/")
//引用RxJava
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
//设置数据解析器
.addConverterFactory(GsonConverterFactory.create())
.build();
APIService mAPIService = retrofit.create(APIService.class);
CurrencyBean currencyBean = new CurrencyBean();
currencyBean.setAppType("2");
currencyBean.setLoginKey("9527");
currencyBean.setSystemID("2");
mAPIService.getPratiques(currencyBean)
//subscribeOn()用于每个observable对象的操作符在哪个线程上运行
.subscribeOn(Schedulers.io())
//compose 操作符能够从数据流中得到原始的被观察者,当创建被观察者时,compose 操作符会立即执行,而不像其他的操作符需要在 onNext() 调用后才能执行。
.compose(new ResponseTransformer())
//observeOn()指定下游运算所在的线程
.observeOn(AndroidSchedulers.mainThread())
//订阅
.subscribe(new Observer<MassageBean>(){
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e("sansuiban", "aaaaa: " + d );
}
@Override
public void onNext(@NonNull MassageBean massageBean) {
Log.e("sansuiban", "aaaaa: " + massageBean.getDengLu().get(0).getBusinessName().toString());
}
@Override
public void onError(@NonNull Throwable e) {
Log.e("sansuiban", "bbbbb: " + e );
}
@Override
public void onComplete() {
Log.e("sansuiban", "onSubscribe: " );
}
});
这里如果有人复制代码运行的话,会发现 new ResponseTransformer();这啥玩意,我咋没有,这个其实是我解析用的,第一层解析的情况下,直接在外边判断情况
public class ResponseTransformer<T> implements ObservableTransformer<BaseResult<T>, T> {
@Override
public ObservableSource<T> apply(Observable<BaseResult<T>> upstream) {
return upstream.subscribeOn(Schedulers.io())
.concatMap(tResponseResult -> {
if (tResponseResult.getData() != null) {
if (tResponseResult.getResult().toString().equals("true")) {
return createData(tResponseResult.getData());
} else {
return Observable.error(new Exception(tResponseResult.getNotice()));
}
} else {
if (tResponseResult.getResult()) {
return createData(tResponseResult.getData());
} else {
return Observable.error(new Exception(tResponseResult.getNotice()));
}
}
});
}
private ObservableSource<? extends T> createData(T data) {
return Observable.create(subscriber -> {
try {
subscriber.onNext(data);
subscriber.onComplete();
} catch (Exception e) {
subscriber.onError(e);
}
});
}
}
这里就完事了,完结撒花...这就是简单实现,封装以后再说









网友评论