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

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

希望可以帮到你

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2819.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号