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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何制作ISO镜像文件

    如何制作ISO镜像文件在windows下,一般需要专用工具软件才能操作ISO文件。比如UltraISO、WinISO、WinImage、DaemonTools等。如果仅仅是想读取ISO文件中的内容,则可以用WinRAR

    2022年8月1日
  • win10下nessus家庭版安装和简单使用「建议收藏」

    win10下nessus家庭版安装和简单使用「建议收藏」1.访问nessue官网下载:https://www.tenable.com/downloads/nessus?loginAttempted=true2.没有找到windows64位,这里下载了windows服务器版64位的3.双击下载的安装包进行安装,一直Next即可4.浏览器访问:http://localhost:8834即可打开Nessus(用谷歌可以直译成中文),如打开浏览器报错选择高级\进阶继续访问就行,点击‘ConnectviaSSL’5.

    2022年10月8日
  • Tomcat频繁宕机的原因分析「建议收藏」

    Tomcat频繁宕机的原因分析「建议收藏」资源!没有完全释放,用完后要父NULL值;数据库连接顺序关闭;优化JAVA虚拟机加入相应的内存参数;TOMCAT在LINUX下不是很稳定;String类型使用,不符合规范;不要在数据库中获取大段文本;JAVA不推荐用String获取大量信息,造成内存溢出就是它;

    2022年7月23日
  • Java Serialized 序列化 作用

    今天在看设计模式时,看到迪米特法则时,有一点,谨慎使用Serialized:一个项目中使用远程方法调用方式传递一个VO(值对象),这个对象就必须实现Serialized接口,也就是把需要网络传输的对象进行序列化,否则会出现NotSerialiableException异常。若VO修改了一个属性的权限,由private改为public访问权限变大了,如果服务器上没有做出相应的变更,就会报…

    2022年4月4日
  • .tar.bz2文件解压命令「建议收藏」

    .tar.bz2文件解压命令「建议收藏」从网络上下载到的源码包,最常见的是.tar.gz包,还有一部分是.tar.bz2包.tar.gz格式解压为tar-zxvfxx.tar.gz.tar.bz2格式解压为tar-jxvfxx.tar.bz2…

    2022年6月6日
  • Android开发好有爱。。刚才在小米论坛上找到了开发的入门教程。。假期有货了

    还是从目前比较感兴趣的东西来开始。最感兴趣的还是小米每周五的刷机,希望以此为动力开发一下东西。。。加油啊。暑假努力哦。。呵呵

    2022年3月8日

发表回复

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

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