Retrofit+RxJava 简单介绍

Retrofit 是一个当前很流行的网络请求库

  想使用它首先在gradle文件中引用

   compile ‘com.squareup.retrofit2:retrofit:2.1.0‘
    compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0‘
    compile ‘com.squareup.retrofit2:converter-gson:2.0.2’

RxJava 是针对于Java语音的一个异步响应式编程库

  compile ‘io.reactivex.rxjava2:rxjava:2.0.1‘
  compile ‘io.reactivex.rxjava2:rxandroid:2.0.1’

Retrofit的使用

  创建一个Retrofit对象

private static void initRetrofit() {
        sRetrofit = new Retrofit.Builder()
                .baseUrl("http://www.weather.com.cn/")
                .client(sOkHttpClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }

  client 设置OkHttp用于拦截器设置

  addCallAdapterFactory()设置支持RxJava返回值为Oservable<M>

  addConverterFactory() 设置支持Gson 直接返回实体类

接下来在创建一个OKHttpClient.Buildr对象

  

OkHttpClient.Builder builder = new OkHttpClient.Builder();

  1设置结果拦截器

Interceptor cacheInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                if (!CommonUtil.isNetworkConnected(MyApplication.getInstance())) {
                    request = request.newBuilder()
                            .cacheControl(CacheControl.FORCE_CACHE)
                            .build();
                }
                Response response = chain.proceed(request);
                Response.Builder newBuilder = response.newBuilder();
                if (CommonUtil.isNetworkConnected(MyApplication.getInstance())) {
                    int maxAge = 0;
                    // 有网络时 设置缓存超时时间0个小时
                    newBuilder.header("Cache-Control", "public, max-age=" + maxAge);
                } else {
                    // 无网络时,设置超时为4周
                    int maxStale = 60 * 60 * 24 * 28;
                    newBuilder.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale);
                }
                return newBuilder.build();
            }
        };

  在这里有网络取最新,没网取缓存

builder.cache(cache).addInterceptor(cacheInterceptor); 

  添加到builder;

  2.设置请求拦截器

Interceptor requestInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request()
                        .newBuilder()
                        .addHeader("Accept", "application/vnd.yu.v4+json")
                        .addHeader("Content-Type", "application/json")
                        .addHeader("Range", "page:1,max:10")
                    .addHeader("Authorization", "")
                        .build();request.headers().toString());
                return chain.proceed(request);
            }
        };

  一般设置统一header 时使用

builder.addNetworkInterceptor(requestInterceptor);

  设置超时重连

builder.connectTimeout(15, TimeUnit.SECONDS);
builder.readTimeout(20, TimeUnit.SECONDS);
builder.writeTimeout(20, TimeUnit.SECONDS);
builder.retryOnConnectionFailure(true);return builder.build();

  OkHttp设置完成。

接下来去设置ApiCallBack

  使用RxJava订阅

  ApiCallBack<M>是abstract要继承Subscriber<M>

public abstract class ApiCallback<M> extends Subscriber<M> {

    public abstract void onSuccess(M model);

    public abstract void onFailure(String msg);

    public abstract void onFinish();

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        if (e instanceof HttpException) {
            HttpException httpException = (HttpException) e;
            int code = httpException.code();
            String msg = httpException.getMessage();
            if (code == 504) {
                msg = "网络不给力";
            }
            if (code == 502 || code == 404) {
                msg = "服务器异常,请稍后再试";
            }
            onFailure(msg);
        } else {
            onFailure(e.getMessage());
        }
        onFinish();
    }

    @Override
    public void onNext(M model) {
        onSuccess(model);
    }

    @Override
    public void onCompleted() {
        onFinish();
    }

}

接下来去写ApiService

  ApiService 是个接口

  Retrofit提供的请求方式用注解修改变量生成URL等

  RxJava方式

@GET("adat/sk/{cityId}.html")
Observable<MainModel> getMainBanner(@Path("cityId") String cityId);

//请求方式@GET,@POST ,@PUT @DELETE 等。
(@Path(“cityId") String cityId)    //修改路径中对应的变量{cityId}
@POST
Observable<MainModel> getTaskToken(@Url String url, @Body String body);

@Headers({"Accept: application/json","Content-Type: application/json"})
@GET
Observable<RecordsTask> getMainTask(@Url String url, @Header("Authorization") String token);

  以上简单写了几种大多数都包括了

需要的已经配置好了 下面去使用它

  

 //RXjava注册
    public void addSubscription(Observable observable, Subscriber subscriber) {
        if (mCompositeSubscription == null) {
            mCompositeSubscription = new CompositeSubscription();
        }
        mCompositeSubscription.add(observable
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber));
    }

  把上面内容写在Base中

  subscribeOn() : 指定

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px; font: 16.0px "PingFang SC"; color: #2f2f2f; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 27.0px; font: 16.0px "PingFang SC"; color: #2f2f2f }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 27.0px; font: 16.0px Helvetica; color: #2f2f2f }
span.s1 { font: 16.0px Helvetica }
span.s2 { }
span.s3 { font: 16.0px "PingFang SC" }
span.Apple-tab-span { white-space: pre }

subscribe()所发生的线程,即Observable.OnSubscribe被激活时所处的线程。或者叫做事件产生的线程。

observeOn():指定用户所运行的线程。或者叫做事件消费的线程。

使用 subscribeOn() 和 observeOn() 两个方法来对线程进行控制了。

在Activity中调用

public void loadWeather(String city) {
        addSubscription(mApiService.getMainBanner(city), new ApiCallback<MainModel>() {
            @Override
            public void onSuccess(MainModel response) {
                mMvpView.onSuccess(response);
            }

            @Override
            public void onFailure(String msg) {
                mMvpView.onFail(msg, 1);
            }

            @Override
            public void onFinish() {

            }
        });
    }

在结束时还需要取消RxJava的注册以免内存泄漏

public void onUnsubscribe() {
        if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {
            mCompositeSubscription.unsubscribe();
        }
    }

结束。

时间: 2024-10-13 12:24:33

Retrofit+RxJava 简单介绍的相关文章

OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用。

okhttp-OkGo 项目地址:jeasonlzy/okhttp-OkGo 简介:OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持 RxJava,比 Retrofit 更简单易用.该库是封装了 okhttp 的网络框架,支持大文件上传下载,上传进度回调,下载进度回调,表单上传(多文件和多参数一起上传),链式调用,可以自定义返回对象,支持 Https 和自签名证书,支持 cookie 的持久化和自动管理,支持四种缓存模式缓存网络数据,支持 301 和 302 重定向,扩展了

设计模式笔记之四:MVP+Retrofit+RxJava组合使用

本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236866&idx=1&sn=da666831f67303eeb7a57c1591204b43&scene=24&srcid=0910wJAKSLdsEFTBKwKfTNor#wechat_redirect http://blog.csdn.net/qq_27778869/article/details/52121208 MVP

基于Retrofit+RxJava的Android分层网络请求框架

目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及数据传输安全性高等特点. Retrofit源码更是经典的设计模式教程,笔者已在之前的文章中分享过自己的一些体会,有兴趣的话可点击以下链接了解:<Retrofit源码设计模式解析(上)>.<Retrofit源码设计模式解析(下)> 但在具体业务场景下,比如涉及到多种网络请求(GET/PU

迅速上手Retrofit+RxJava+Okhttp+FastJson的网络框架[RRO]

Retrofit以其灵活的调用形式, 强大的扩展性著称. 随着RxAndroid的推出, Retrofit这样的可插拔式的网络框架因其可以灵活兼容各种数据解析器, 回调形式(主要还是RxJava啦)而更加风靡. 但是! Retrofit2官方虽有一堆集成第三方json解析的实现,比如gson-converter等等..但唯独就是没有FastJson, 这让我很不解..于是自己动手模仿gson-converter写了一个fastjson-converter, 并封装为一个更易用的适合Android

Android-MVP+Retrofit+Rxjava实现一个知乎日报客户端

使用MVP+Retrofit+Rxjava实现一个知乎日报客户端,界面基于Material design,还没有全部完成orz,,放假太懒 效果图 开源项目 name introduction butterknife Annotate fields with @BindView and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout. MaterialT

优雅地使用Retrofit+RxJava(二)

前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现很多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期,我就写写平时我在使用RxJava+Retrofit怎么去灵活地处理一些场景.比如说一些比较常见的场景: 网络请求过程中token的处理 网络请求数据的加密与解密 为每个请求添加固定的头部,比如说当前版本号,Rsa的密钥等等 规范化每个网络请求,让代码只写一次 我自己平时对代码的简洁性要求非常高,所以retrofit+rxjava正好切中了我的痛点,

Android开发之Retrofit+RxJava的使用

Retrofit是Square公司开发的一款针对Android网络请求的一个当前很流行的网络请求库. http://square.github.io/retrofit/ https://github.com/square/retrofit 使用需引入: compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'io.reactivex

Https系列之一:https的简单介绍及SSL证书的生成

Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http.https,基于spring boot四:https的SSL证书在Android端基于okhttp,Retrofit的使用 所有文章会优先在:微信公众号"颜家大少"中发布转载请标明出处 一:本文的主要内容介绍 https的介绍SSL证书的介绍自签名SSL证书介绍及生成方法CA证书介绍及申

python的列表,元组和字典简单介绍

引 入 java                                   python 存取多个值:数组或list集合 ------------------------> 列表,元组 key-value格式:    Map        ------------------------>    字典 自己学习发现,java跟python这两门面向对象语言在数据类型的定义上,很多思想都是互通的,这里不说java,简单介绍一下python的列表,元组和字典. 一.列表 List: 最通