RxJava和Retrofit的简单使用

在最近做的项目中,因为频繁用到网络请求,所以使用了现在比较流行的框架RxJava和Retrofit来代替之前的Okhttp的繁琐请求。

retrofit是用来做网络请求操作,RxJava是用来切换线程、转换数据操作的。

首先第一步,使用三方的框架,肯定是先添加依赖包。项目中用的Rxjava2.0、retrofit2.0,而且Rxjava2.0和Rxjava1.0并不兼容,所以使用起来需要注意。添加一下依赖。

compile "com.squareup.retrofit2:retrofit:$rootProject.versions.libRetrofit"compile "com.squareup.retrofit2:converter-gson:$rootProject.versions.libRetrofit"compile "com.squareup.retrofit2:adapter-rxjava2:$rootProject.versions.libRetrofit"compile "com.squareup.okhttp3:okhttp:$rootProject.versions.libOkhttp"compile "com.squareup.okhttp3:logging-interceptor:$rootProject.versions.libOkhttp"compile "io.reactivex.rxjava2:rxjava:$rootProject.versions.libRxJava"compile "io.reactivex.rxjava2:rxandroid:$rootProject.versions.libRxAndroid"

第二步,创建一个Api实例  用来获取接口的请求对象    在init()方法中通过baseUrl或得到Retrofit对象,  请求方法等都是放在接口中,接口与retrofit关联在getNetDemo()方法中实现。

public class NetDemoApi {    private static NetDemoApi nInstance = new NetDemoApi();    private Retrofit mRequestDemo;    //baseUrl是每一个网络请求的前段,但必须是以 “/”结尾    private String mRequestDemoBaseUrl = "www.baidu.com/";    public static NetDemoApi getInstance(){        return nInstance;    }    private NetDemoApi(){        init();    }

private void init() {        //这一步就把baseurl和Retrofit关联了起来,生成Retrofit对象        mRequestDemo = configure(mRequestDemoBaseUrl);    }

private NetDemo getNetDemo(){        return mRequestDemo.create(NetDemo.class);    }

//配置retrofit    private Retrofit configure(String baseUrl){        HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {            @Override            public void log(String message) {                WLog.i(message);            }        });        logging.setLevel(HttpLoggingInterceptor.Level.BODY);        OkHttpClient.Builder builder = new OkHttpClient.Builder();        //这只网络请求的拦截器   如果需要获取到响应头等相应信息,在此处就可以获得  如果不需要可以不写        builder.networkInterceptors().add(new Interceptor() {            @Override            public Response intercept(Chain chain) throws IOException {                Response response = chain.proceed(chain.request());                    Headers headers = response.headers();                    List<String> cookies = headers.values("Set-Cookie");                    Session session = Session.getInstance();                    session.setCookies(Utils.getCookie(cookies));                    Log.d(getClass().getSimpleName(),"设置cookie " + session.getCookies());                return response;            }        });        builder.addInterceptor(logging);        builder.connectTimeout(30, TimeUnit.SECONDS);        builder.readTimeout(40, TimeUnit.SECONDS);        OkHttpClient client = builder.build();        return new Retrofit.Builder()                .baseUrl(baseUrl)                .client(client)                //这是rxjava的转换器,这个是rxjava2的默认适配器工厂,如果我们需要转换成bean,可以添加gson的转换器,直接添加就可以,需要添加依赖包                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                .build();    }}

第三步,写实现的接口,这个接口中,才是我们需要请求的路径  如下   @get 就是一个get请求的方法,     @post就是一个post请求

@url  是直接传入一个已知的URl进去,直接请求Url,而且跟baseUrl无关,不会跟baseUrl进行拼接;

@Query 就是在URl后面进行键值对的拼接,如下  tip传入1 ,就会把 tip=1 拼接到loginicon=true的后面,get和post请求都是这样拼接。

@Path 就是把传入的字符串直接传入注解中{uuid}中的位置处;

@body 是post请求时,传入的requestBody对象;

@Header  可以给网络请求添加请求头信息,添加Cookie就写cookie,@Header("Cookie") String cookie,

以上传入的url参数都会和baseUrl进行拼接,得到一个完整的Url去进行网络请求(除了@url)。

返回的就是Observable对象,我们调用此方法后,获得observable对象,接下来用Rxjava进行数据解析,筛选。

public interface NetDemo {    @GET    Observable<ResponseBody> requestDemo(@url String url);     @GET("cgi-bin/mmwebwx-bin/login?loginicon=true")  Observable<ResponseBody> requestScanResult(@Query("tip") int tip,                                             @Query("uuid") String uuid,                                             @Query("r") String r,                                             @Query("_") String p);

  @POST("qrcode/{uuid}")  Observable<ResponseBody> requestGenQRCode(@Path("uuid") String uuid,                                            @Body RequestBody body);
  @POST("cgi-bin/mmwebwx-bin/webwxstatusnotify?lang=zh_CN")  public Observable<ResponseBody> webwxstatusnotify(@Query("pass_ticket") String passTicket,                                                    @Header("Cookie") String cookie,                                                    @Body RequestBody body);}

第四步,在代码中进行网络请求,

Observable<ResponseBody> observable = WeChatNetApi.getInstance().getLoginInfo().requestLoginInfo(url);      //返回Observable对象observable.subscribeOn(Schedulers.io())                                           //进行网络请求是在那个线程  io 就是在子线程     .map(new Function<ResponseBody, Bitmap>() {                                 //可以通过map进行转换,把结果转换为一个我们需要使用的类型(如demo,返回一个bitmap类型)        @Override        public Bitmap apply(@io.reactivex.annotations.NonNull                                  ResponseBody responseBody) {          return BitmapFactory.decodeStream(responseBody.byteStream());        }    })    .flatMap(new Function<String, ObservableSource<Bitmap>>() {                         //还可以通过flatMap转化为Observable对象,转换为Observable对象后,还可以继续进行转换操作,直到我们需要的类型        @Override        public ObservableSource<Bitmap> apply(                @io.reactivex.annotations.NonNull String uuid) {            return genQRCode(uuid);        }    }    .filter(new Func1<Community, Boolean>() {                                     //只有返回true,才会继续向下走,如果返回是false,就不会继续向下走      @Override       public Boolean call(Community community) {         return community.houses.size()>10;       }     })
        .observeOn(AndroidSchedulers.mainThread())                                    //网络请求结束,切换回主线程,进行数据处理,或者显示的操作    .subscribe(new Observer<ResponseBody>() {                                  //转换结束,得到了我们需要的数据,进行显示,先切换到主线程        @Override        public void onSubscribe(Disposable d) {              }        @Override        public void onNext(ResponseBody body) {                                 //订阅后subscribe会执行的方法            messageActivity.returnTextInfo(asJsonObject, l);        }        @Override        public void onError(Throwable e) {                                    //如果流程中有报错,会走到此

    }        @Override        public void onComplete() {                                         //onNext之后,如果还有后续的动作,可以在此继续,onnext后会调用complete;

    }    });

.doOnNext(new Consumer<ResponseBody>() {                                   //doOnNext  直接订阅是一个偷懒的写法,这样写代码比较简洁,而且这一步操作完之后,我也不需要继续任何操作            @Override            public void accept(@io.reactivex.annotations.NonNull ResponseBody body) throws Exception {                handleLoginInfoResponse(url,body);            }        }).subscribe();
时间: 2024-11-05 19:44:05

RxJava和Retrofit的简单使用的相关文章

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

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

RxJava 与 Retrofit 结合的最佳实践

前言 RxJava和Retrofit也火了一段时间了,不过最近一直在学习ReactNative和Node相关的姿势,一直没有时间研究这些新东西,最近有个项目准备写,打算先用Android写一个Demo出来,却发现Android的世界发生了天翻地覆的变化,EventBus和OKHttp啥的都不见了,RxJava和Retrofit是什么鬼? 好吧,到Github上耐着性子看过了RxJava和Retrofit的介绍和几个Demo,原来Android的大神Jake Wharton为Retrofit这个项

RxJava整合Retrofit遇到的问题总结

一:初上手(填坑) Observable将事件序列执行完毕后,会回调Observe的onNext()方法和onCompleted()方法,当出现异常/错误时会调用onError()方法. 由此,我们推断,问题出现的地方应该是在Observable的执行过程. 先阐述一下笔者的需求,使用retrofit和rxjava进行简单的网络请求(请求得到的数据自动装配为实体类),后端给的返回格式是标准的Result格式(即status,message,data),前两者相对固定,而data域可能是User对

RxJava 与 Retrofit

RxJava 与 Retrofit

rxjava 调用retrofit执行网络请求的过程

retrofit流程图 -1.RxJava调用Retrofit,从requestGtPushSaeUserInfo()中获得被观察者observable,然后new一个观察者向它订阅 0.从业务中发起网络请求调用具体接口 RobotApiService就是Retrofit需要的接口文件 1.在RobotApiService文件中会新建一个Retrofit对象添加RxJava2CallAdapterFactory对象用以产生RxJava2CallAdapter, Retrofit retrofit

Rxjava、Retrofit返回json数据解析异常处理

每个App都避免不了要进行网络请求,从最开始的用谷歌封装的volley到再到android-async-http再到OKHttpUtils再到现在的Retrofit和RxJava,从我自己用后的体验来看,用了retrofit和RxJava真的回不去了,回不去了,不去了,去了,了-(哈哈,本来还想分析下这四个的区别,网上这样的文章很多,我就没必要多添乱了-.-).不多逼逼,下面开始正文. 1.Rxjava和Retrofit依赖导入: compile 'io.reactivex:rxandroid:

RxJava开发精要8 – 与REST无缝结合-RxJava和Retrofit

原文出自<RxJava Essentials> 原文作者 : Ivan Morgillo 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : yuxingxin 项目地址 : RxJava-Essentials-CN 在上一章中,我们学习了如何使用调度器在不同于UI线程的线程上操作.我们学习了如何高效的运行I/O任务而不用阻塞UI以及如何运行耗时的计算任务而不耗损应用性能.在最后一章中,我们将创建一个最终版的真

MVP模式入门(结合Rxjava,Retrofit)

本文MVP的sample实现效果: github地址:https://github.com/xurui1995/MvpSample 老规矩,在说对MVP模式的理解之前还是要再谈谈MVC模式,了解了MVC的缺点.我们才知道为什么要用MVP. 关于MVC的图解,我在网上找到了一些图.如下:    MVC模式在开发web或者管理系统中应用很多,我们的View与人交互,人点击鼠标或者输入一些东西时,View会发送相应的指令给Controller,Controller 接到指令,再去调用Model的方法去

[Android] 转-RxJava+MVP+Retrofit+Dagger2+Okhttp大杂烩

原文url: http://blog.iliyun.net/2016/11/20/%E6%A1%86%E6%9E%B6%E5%B0%81%E8%A3%85/ 这几年来android的网络请求技术层出不穷,网络请求从最初的HttpClient,HttpURLConnection到Volley,OkHttp,Retrofit.但是如果直接使用,每个网络请求都会重复很多相同的代码,这显然不是一个老司机需要的.接下来我们就讲讲网络请求封装那点事. 主要利用以下技术点 - Retrofit2 Retrof