iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android RxJava与Retrofit怎么结合使用
  • 560
分享到

Android RxJava与Retrofit怎么结合使用

2023-07-05 11:07:52 560人浏览 薄情痞子
摘要

本篇内容介绍了“Android RxJava与Retrofit怎么结合使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!添加依赖c

本篇内容介绍了“Android RxJava与Retrofit怎么结合使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

添加依赖

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'io.Reactivex.rxjava2:rxjava:2.x.y'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'com.squareup.okHttp3:logging-interceptor:3.10.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'

添加依赖本并不想多说,我想大家都知道,但是对于刚接触这些知识的时候我想有没有人在看网上的文章时会觉得有些依赖是在哪找到并添加的呢?例如:com.squareup.retrofit2:converter-gson:2.3.0我们要添加一个GsonConverter的依赖。对于刚接触这些知识和不经常逛GitHub的人来说会不会一脸懵逼呢?不管会不会,反正我第一次接触的时候确实懵逼了下。这里给那些懵逼过的人提示下,我们可以通过打开gitHub上项目的子文件查看到相应的依赖。比如GitHub上Retrofit项目中:retrofit/retrofit-converters/gson/这个路径下就可以查看到相应的GsonConverter的依赖。

封装Retrofit(单例模式)

public class HttpRequest {    public static final long CONNECTTIME = 30000;    public static final String BASE_URL = "http://jxhdapi.ooowin.com/";    private  ApiService apiService;    public HttpRequest() {        //添加日志拦截器        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {            @Override            public void log(String message) {                Log.d("TAG", "==========" + message);            }        }).setLevel(HttpLoggingInterceptor.Level.BODY);        //获取OkHttpClient        OkHttpClient client = new OkHttpClient.Builder()                .connectTimeout(CONNECTTIME, TimeUnit.MICROSECONDS)                .readTimeout(CONNECTTIME,TimeUnit.MICROSECONDS)                .writeTimeout(CONNECTTIME,TimeUnit.MICROSECONDS)                .addInterceptor(interceptor)                .addNetworkInterceptor(new HttpHeaderInterceptor())                .build();        //初始化Retrofit        Retrofit retrofit = new Retrofit.Builder()                .baseUrl(BASE_URL)                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                .client(client)                .build();        apiService = retrofit.create(ApiService.class);    }    //  创建单例    private static class SingletonHolder {        private static final HttpRequest INSTANCE = new HttpRequest();    }    public static ApiService getApi(){        return SingletonHolder.INSTANCE.apiService;    }}

这里我们可以看到添加了两个拦截器:日志拦截器和网络请求Header拦截器,我们都知道对于Retrofit我们是可以直接通过GsonConverter转换成实体类的,但有的时候我们又想去获取它的JSON数据进行查看,这个时候我们就可以通过添加日志拦截器实现,但一定要给它设置setLevel方法,设置不同的属性打印出来的数据是不一样的。至于添加Header拦截器我想大家都应该知道,正常工作中接口所需要的Header都是相同的,所以我们要进行统一添加:

public class HttpHeaderInterceptor implements Interceptor {    @Override    public Response intercept(Chain chain) throws IOException {        Request request = chain.request();        Request build = request.newBuilder()//                .addHeader("","")   添加header                .build();        return chain.proceed(build);    }}

封装实体类

{    "code": 1,    "msg": "操作成功",    "data": {······}}

通常我们从服务端拿到的json数据就像上面那样,有些返回的字段内容格式是固定的,比如:code和msg。有些则是不确定,如:data。这个时候我们就需要对其进行二次处理了,我们可以写一个基类:

public class BaseBean<T> {    private int code;    private String msg;    private T data;    public int getCode() {        return code;    }    public void setCode(int code) {        this.code = code;    }    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public T getData() {        return data;    }    public void setData(T data) {        this.data = data;    }}

利用泛型来表示data中的不确定格式的数据,这里用一个获取全国所有省的数据接口进行测试

public interface ApiService {    //获取省列表    @GET("common/areas")    Flowable<BaseBean<List<Province>>> province();}

实体类封装好后我们可以进行一下测试:

HttpRequest.getApi()            .province()            .subscribeOn(Schedulers.io())            .observeOn(AndroidSchedulers.mainThread())            .subscribe(new Subscriber<BaseBean<List<Province>>>() {                @Override                public void onSubscribe(Subscription s) {                }                @Override                public void onNext(BaseBean<List<Province>> listBaseBean) {                }                @Override                public void onError(Throwable t) {                }                @Override                public void onComplete() {                }            });}

通过上面的代码我们不难看出这是经过封装后的效果,但是我们会发现这样的请求我们难道每次都要去添加调度器和重写Subscriber的几个方法吗?那岂不还是很繁琐。是的,接下来我们就对这些进行封装。

使用compose操作符

public class SchedulersHelper implements FlowableTransfORMer{    @Override    public Publisher apply(Flowable upstream) {        return  upstream.subscribeOn(Schedulers.io())                .observeOn(AndroidSchedulers.mainThread());    }}

使用compose操作符可以直接对当前Flowable进行操作,所以我们自然可以把切换线程的操作加入这里。接下来就是Subscriber进行封装了。

封装Subscriber

public abstract class MySubscriber<T> implements Subscriber<T>{    @Override    public void onSubscribe(Subscription s) {        s.request(Long.MAX_VALUE);        showLoading();    }    @Override    public void onNext(T t) {        //code为1代表服务器返回成功的数据        if (((BaseBean)t).getCode() == 1) {            //成功后返回data数据进行处理即可            onSuccess((T) ((BaseBean) t).getData());        }else {            //处理服务器返回错误code        }    }    @Override    public void onComplete() {        finishLoading();    }    @Override    public void onError(Throwable t) {        finishLoading();        //处理网络异常        Log.d("TAG","=========" + t);    }    protected abstract void onSuccess(T t);    protected abstract void showLoading();    protected abstract void finishLoading();}

如上所示,我们根据服务端返回的code判断是否成功,将data数据传出去。服务器返回的错误码和网络请求错误我们都可以统一在这里进行处理。然后我们再去测试接口。

测试

HttpRequest.getApi().province()        .compose(new SchedulersHelper())        .subscribe(new MySubscriber() {            @Override            protected void onSuccess(Object o) {            }            @Override            protected void showLoading() {            }            @Override            protected void finishLoading() {            }        });

可以的看到操作流程已经变的很简单了,对于showLoading()finishLoading()这两个方法我们可以不需要放在这里面,这个是我方便测试便将其写在里面了。

“Android RxJava与Retrofit怎么结合使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Android RxJava与Retrofit怎么结合使用

本文链接: https://www.lsjlt.com/news/351404.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android RxJava与Retrofit怎么结合使用
    本篇内容介绍了“Android RxJava与Retrofit怎么结合使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!添加依赖c...
    99+
    2023-07-05
  • Android RxJava与Retrofit结合使用详解
    目录添加依赖封装Retrofit(单例模式)封装实体类使用compose操作符封装Subscriber测试结束如今RxJava和Retrofit的结合使用估计已经相当普遍了,自己工作...
    99+
    2023-03-12
    Android RxJava与Retrofit Android RxJava Android Retrofit
  • 如何在Android中利用Retrofit与Rxjava实现网络请求
    今天就跟大家聊聊有关如何在Android中利用Retrofit与Rxjava实现网络请求,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先做一下准备工作,导入需要引用的文件compi...
    99+
    2023-05-31
    retrofit rxjava android
  • Retrofit框架怎么在Android中使用
    Retrofit框架怎么在Android中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系...
    99+
    2023-06-14
  • c#怎么与postgresql结合使用
    要使用C#与PostgreSQL结合,你可以使用 Npgsql 数据库驱动程序。以下是一个简单的示例,演示如何在C#中连接到Post...
    99+
    2024-04-27
    c# postgresql
  • SignalR怎么与Redis结合使用
    要将SignalR与Redis结合使用,可以使用Redis作为SignalR backplane,以便在多个服务器之间共享实时通信消...
    99+
    2024-05-09
    SignalR Redis
  • spring怎么与struts结合使用
    这期内容当中小编将会给大家带来有关spring怎么与struts结合使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Struts调用流程如下图所示。       ...
    99+
    2023-05-31
    spring struts
  • Redis怎么与Spring结合使用
    这期内容当中小编将会给大家带来有关Redis怎么与Spring结合使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Spring-data-redis是spring大家族的一部分,提供了在srping应用...
    99+
    2023-05-31
    spring redis
  • Nginx怎么与CDN结合使用
    要将Nginx与CDN结合使用,通常有两种方式: 配置Nginx作为CDN的源站:将Nginx配置为CDN的源站,CDN会向Ng...
    99+
    2024-05-06
    Nginx
  • Redis怎么与RabbitMQ结合使用
    Redis和RabbitMQ是两种不同的消息中间件,它们在功能和使用场景上有所不同。通常情况下,Redis用于缓存和数据存储,而Ra...
    99+
    2024-05-07
    Redis RabbitMQ
  • Redis怎么与Docker结合使用
    要将Redis与Docker结合使用,需要以下步骤: 在Docker中拉取Redis镜像: 在终端中运行以下命令可以从Docker...
    99+
    2024-05-07
    Redis Docker
  • Mybatis怎么与Spring结合使用
    Mybatis怎么与Spring结合使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。所需要用到的其他工具或技术:项目管理工具 : Maven前台WEB展示:JSP其他框架:S...
    99+
    2023-05-31
    mybatis spring
  • spring boot怎么与kafka结合使用
    spring boot怎么与kafka结合使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。引入相关依赖<dependency> <groupId>o...
    99+
    2023-05-31
    springboot kafka
  • Python中Playwright与pyunit怎么结合使用
    这篇文章主要介绍“Python中Playwright与pyunit怎么结合使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中Playwright与pyunit怎么结合使用”文章能帮助大...
    99+
    2023-07-05
  • Android怎么使用Coroutine + Retrofit打造简单的HTTP请求库
    这篇文章主要介绍了Android怎么使用Coroutine + Retrofit打造简单的HTTP请求库,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基于 kotlin/co...
    99+
    2023-06-14
  • Android怎么使用Retrofit实现自定义Converter解析接口
    本篇内容介绍了“Android怎么使用Retrofit实现自定义Converter解析接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!不知...
    99+
    2023-07-05
  • 将 bytes.Buffer 与 csv.writer 结合使用
    从现在开始,我们要努力学习啦!今天我给大家带来《将 bytes.Buffer 与 csv.writer 结合使用》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文...
    99+
    2024-04-05
  • CentOS怎么与虚拟机技术结合使用
    CentOS是一个流行的Linux发行版,可以与各种虚拟化技术结合使用,包括VirtualBox、VMware和KVM等。 使用...
    99+
    2024-05-09
    CentOS
  • 将 MySQL 与 Apache 结合使用
    MySQL 和 Apache 是两个独立的软件,可以在同一台服务器上安装和运行。下面是将 MySQL 和 Apache 结合使用的一...
    99+
    2023-10-20
    MySQL
  • laravel-admin与vue结合怎么用
    这篇文章主要介绍laravel-admin与vue结合怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!由于 Laravel-admin 采用的是 pjax 的方式刷新页面,意味着...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作