美文网首页
Android Retorfit2 + Rxjava简单使用

Android Retorfit2 + Rxjava简单使用

作者: ryanxun | 来源:发表于2021-04-16 17:31 被阅读0次
嘿,今天的你过的还好吗

最近想系统看看动态代理的东西,然后查各种文章,最后不是用不了的,就是一片一片的,无奈之下,动手操作
历经一天的时间成功的明白了他的简单使用流程,以后可以牛逼的说我会用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);
            }
        });
    }
}

这里就完事了,完结撒花...这就是简单实现,封装以后再说

没更新动态或者频繁更新动态的时候都是在认真生活

相关文章

网友评论

      本文标题:Android Retorfit2 + Rxjava简单使用

      本文链接:https://www.haomeiwen.com/subject/dgbelltx.html