Android MVP+RxJava+Retrofit (2) RxJava+Retrofit

说道RxJava+Retrofit 的组合 大家基本不陌生,先介绍一下Retrofit
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。说白了真正工作的还是OkHttp 。

Retrofit的使用
先简单介绍一个网络请求的例子,注解之类的放在后面去说

(1) 添加Retrofit库的依赖

    implementation "io.reactivex.rxjava2:rxjava:2.2.0"
    implementation "io.reactivex.rxjava2:rxandroid:2.0.2"
    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.google.code.gson:gson:2.8.5'

(2)创建 用于描述网络请求 的接口
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数

public interface Api {
    @FormUrlEncoded
    @POST(Constant.ShopGetGoods)
    Call<GoodsBean> getCall(@Field("cid") String cid, @Field("page") String page);
}

(3)创建Retrofit实例

 Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.IP)
                .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
                .build();

(4) 发送请求

    Api api = retrofit.create(Api.class);
        Call<GoodsBean> call = api.getCall("0", "1");
        call.enqueue(new Callback<GoodsBean>() {
            @Override
            public void onResponse(Call<GoodsBean> call, Response<GoodsBean> response) {
                List<GoodsBean.ResultBean> result = response.body().getResult();
                //请求成功了
                etUserName.setText(result.get(0).getP_name());
            }
            @Override
            public void onFailure(Call<GoodsBean> call, Throwable t) {
                Toast.makeText(LoginActivity.this, "网络请求失败", Toast.LENGTH_SHORT).show();
            }
        });

接下来开始介绍一下注解了上面我所使用的 @POST 注解发送了POST请求,Retrofit还提供了很多其他的注解类型
在这里插入图片描述

第一类 网络请求方法

@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式
@HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用 及 更多功能拓展
具体使用:通过属性method、path、hasBody进行设置

第二类 标记

@FormUrlEncoded
请求体是是是一个表单数据
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值

@Multipart
请求体是一个支持文件上传的表单数据
表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值

第三类 网络请求参数

@Header & @Headers
添加请求头 &添加不固定的请求头

@Body
以 Post方式 传递 自定义数据类型 给服务器

@Field & @FieldMap
发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用

@Part & @PartMap
发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用

实例2 上传文件

一定要使用 Multipart 关于文件 我采用的是 @Part MultipartBody.Part

    public interface IInfo {
        @Multipart
        @POST("android/Member/memedit")
        Call<MinBean> setSubit(@Part("nickname") RequestBody nickname, @Part("sex") RequestBody sex, @Part("uid") RequestBody uid, @Part("platenumber") RequestBody platenumber, @Part MultipartBody.Part thumb);
    }

创建Retrofit 实例 上传文件+字段的时候 必须变为RequestBody 参数 方可才能上传

   Retrofit retrofit2 = new Retrofit.Builder()
            .baseUrl("http://qxj.hefawangluo.com/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(new OkHttpClient())
            .build();
    IInfo iInfo = retrofit2.create(IInfo.class);
    RequestBody nickname = RequestBody.create(MediaType.parse("multipart/form-data"), "哈哈");
    RequestBody sex = RequestBody.create(MediaType.parse("multipart/form-data"), "1");
    RequestBody uid = RequestBody.create(MediaType.parse("multipart/form-data"), "30");
    RequestBody platenumber = RequestBody.create(MediaType.parse("multipart/form-data"), "辽A66666");
    MultipartBody.Part thumb = MultipartBody.Part.createFormData("thumb", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
    Call<MinBean> call = iInfo.setSubit(nickname, sex, uid, platenumber, thumb);
    
     call.enqueue(new Callback<MinBean>()

    {
        @Override
        public void onResponse (Call < MinBean > call, Response < MinBean > response){
        Log.e("AAA1", "onResponse: " + response.body().getMessage());
    }

        @Override
        public void onFailure (Call < MinBean > call, Throwable t){

    }
    });

介绍完Retrofit大体使用情况,接下来就简单的介绍RxJava的使用,Retrofit 与RxJava 一百度就很多原理之类的大体说的都差不多,大同小异.我主要以实战为主,如何使用 稍带点基础…

初始化Retrofit的时候的必要配置:

.addCallAdapterFactory(RxJava2CallAdapterFactory.create()

这个是用来决定你的返回值是Observable还是Call
如果返回为Call那么可以不添加这个配置。如果使用Observable那就必须添加这个配置。否则就会请求的时候就会报错!

 // 注意 Observable的情况
    @FormUrlEncoded
    @POST(Constant.ShopGetGoods)
    Observable<GoodsBean> getCall(@Field("cid") String cid, @Field("page") String page);

第二配置

.addConverterFactory(GsonConverterFactory.create())

这个配置是将服务器返回的json字符串转化为对象

替换成RxJava请求代码如下

  Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.IP)
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
                
        Api api = retrofit.create(Api.class);
        api.getCall("0", "1")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<GoodsBean>() {
                               @Override
                               public void accept(GoodsBean goodsBean) throws Exception {
                                    etUserName.setText(goodsBean.getResult().get(0).getP_name()+"==");
                                   Toast.makeText(LoginActivity.this, "请求成功", Toast.LENGTH_SHORT).show();
                               }
                           }, new Consumer<Throwable>() {
                               @Override
                               public void accept(Throwable throwable) throws Exception {
                                   // 处理异常
                                   Toast.makeText(LoginActivity.this, "请求失败", Toast.LENGTH_SHORT).show();
                               }
                           }

                );

跟上面的相比感觉也没差多少,剩下的就是封装以及优化处理了,再把前面的MVP 设计模式知识点串联起来. 下一篇巩固一下.我这里说的RxJava过于潦草,如果有深入了解的童鞋,我推荐看一下
Carson_Ho大神的文章 https://www.jianshu.com/nb/14302692

猜你喜欢

转载自blog.csdn.net/MacaoPark/article/details/107210811