说道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账号...