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

希望可以帮到你

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

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

(0)
上一篇 2021年3月12日 下午10:52
下一篇 2021年3月12日 下午10:52


相关推荐

  • jvm可达性分析算法_对点网络

    jvm可达性分析算法_对点网络作者:张华发表于:2016-04-05版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99)IP层叫分片,TCP/UDP层叫分段。网卡能做的事(TCP/UDP组包校验和分段,IP添加包头校验与分片)尽量往网卡做,网卡不能做的也尽量迟后分片(发送)或提前合并片(接收)来减少在网络栈中传输和处理的包数目,

    2025年6月14日
    4
  • 个人微信号API接口,微信机器人

    个人微信号API接口,微信机器人前段时间公司需求开发一套自定义的微信机器人,需求是可以自己批量添加好友、批量打标签等进行好友管理,社群管理需要自动聊天,自动回复,发朋友圈,转发语音,以及定时群发等,还可以提取聊天内容,进行数据汇总,收藏快捷回复各种功能!一堆需求砸下来,调研开发了3个月,3个月啊!!!(主要被各种技术走偏路),终于成功了,都是走过的心酸泪,分享给大家,大家学习完,记得给我点个赞!!!大家一般需求点无非是以下几个需求:1.开发个人微信营销系统2.开发自定义的微信机器人,3.开发微信智能聊天客服系统

    2022年5月18日
    80
  • webpack优化之HappyPack实战

    webpack优化之HappyPack实战由于运行在 Node js 之上的 Webpack 是单线程模型的 所以 Webpack 需要处理的事情需要一件一件的做 不能多件事一起做 我们需要 Webpack 能同一时间处理多个任务 发挥多核 CPU 电脑的威力 HappyPack 就能让 Webpack 做到这点 它把任务分解给多个子进程去并发的执行 子进程处理完后再把结果发送给主进程 由于 JavaScript 是单线程模型 要想发

    2026年3月26日
    2
  • ArrayList初始化的4种方法

    ArrayList初始化的4种方法参考 https beginnersboo com 2013 12 how to initialize an arraylist 1 Arrays asListArrayL lt Type gt obj newArrayList lt Type gt Arrays asList Objecto1 Objecto2 Objecto3 soon

    2026年3月20日
    2
  • uniapp页面跳转传参_uni怎么做api跳转

    uniapp页面跳转传参_uni怎么做api跳转今天看Dcloud官网更新了个uni-app,据说一套代码三端发布(Android,iOS,微信小程序),果断一试。uni.navigateTo(OBJECT)保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。OBJECT参数说明参数 类型 必填 说明 url String 是 需要跳转的应用内非…

    2022年8月13日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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