MVP+Retrofit2+RxJava使用方法demo

前段时间了解到MVP+Retrofit2+RxJava非常火,也确实好用。正好前几天咬牙研究了一番,故写一篇博客,和大家分享。此类资料很多,写的不好,高手勿喷。



正题

MVP相信大家已经很熟,使用的很广泛。相比MVC而言,整个项目结构确实很清晰有条理。


Model:       IModel,ModelImpl数据模型:访问数据和业务逻辑。面向接口编程
View:        activity,视图展示和与用户交互
Presenter:   IPresenter,PresenterImpl 连接View和Model(作用等同于MVC的Activity)
与MVC区别:MVP层次清晰,Model不可以访问View。降低了View与Model的耦合度

此demo的结构:



不多说了,稍后看我的项目源码,或网上也有大把的例子。


Retrofit2是Square公司的优秀产品,还有OKHTTP,picasso,otto等产品。Retrofit有1.x版本,现在的版本是2.1.0。

新版本与老版本的用法略有不同,本文中使用的是新版本用法。

Retrofit框架,主要的功能使对请求的封装简化,表面的感觉和okhttp的差不多,但是他还提供了各种扩展功能。内部已经内置了okhttp框架,在使用时可以不导入okhttp的引用环境,也可以不设置okhttp。retrofit提供多种数据解析的方式,json,xml等。

其他的废话不说了,概念性问题请百度。接下来让代码上场。

配置

在module的build.gradle文件中需要添加依赖库,如下:

compile 'com.squareup.retrofit2:retrofit:2.1.0'           //这个是retrofit的依赖库
compile 'com.squareup.retrofit2:converter-jackson:2.1.0'  //这个是retrofit对jackson的支持,可用jackson的方式来解析json数据
compile 'com.squareup.retrofit2:converter-gson:2.1.0'     //<span style="font-family: Arial, Helvetica, sans-serif;">这个是retrofit对gson的支持,可用gson的方式来解析json数据</span>
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'     //这个是retrofit对rxjava异步任务的扩展支持,
compile 'io.reactivex:rxjava:1.1.7                        //这个包可以不加,上面一个就包含了
compile 'io.reactivex:rxandroid:1.2.1'                    //这个rxjava对android的扩展,代码中AndroidSchedulers类将引用到



compile 'com.squareup.okhttp3:okhttp:3.4.0'               //这个是okhttp的依赖库,retrofit已经内置了,可以不加
<pre name="code" class="html" style="text-align: justify;">compile 'com.squareup.okio:okio:1.9.0'                    //这个是okhttp里对okio的依赖库,也可以不加
compile 'com.squareup.okhttp3:logging-interceptor:3.4.0' //这个是okhttp对logging的的一个依赖库,可以不加

 

当添加了retrofit2.1.0的依赖后,make project,在项目的External Libraries扩展库中就会导入相关的依赖库:



用retrofit,肯定需要访问网络了,记得加internet权限:

<uses-permission android:name="android.permission.INTERNET"/>

本例请求的json数据为天气预报,测试数据使用。

http://www.weather.com.cn/data/cityinfo/101010100.html

返回的json数据:

{"weatherinfo":{"city":"北京","cityid":"101010100","temp1":"-2℃","temp2":"16℃","weather":"晴","img1":"n0.gif","img2":"d0.gif","ptime":"18:00"}}


故我们需要生成对应的java bean。逐字手写吗?no,用gsonformet插件。打开android studio的settings,选择plugins选项,点击中间的Browse  repositories按钮,然后在弹出界面的左上角输入Gsonformat,选中后点击右侧的install安装,完成后重启。

使用方法更简单:新建一个类,光标定位到这个类里面(光标最好定位在类的大括号范围内,在大括号外面后再按快捷键不会出现想要的选项),按快捷键Alt + Insert,选择第一项GsonFormat,然后在出现的窗口里面粘贴完整的json串,确定即可。然后看看当前类里面有什么。。。。。。


编写retrofit请求服务接口类和方法:

public interface IWeatherService {

    /**
     * Retrofit的原始用法
     * @return
     */
    @GET("data/cityinfo/101010100.html")
    Call<WeatherBean> getWeather();

    /**
     * Rxjava的用法
     * @return
     */
    @GET("data/cityinfo/101010100.html")
    Observable<WeatherBean> getWeatherRxJava();

    /*@POST("data/cityinfo/101010100.html")
    Observable<WeatherBean> getWeather();*/
}

上面这个接口方法里面可以写很多注解,网上查询一下吧,我这只写个简单例子。

下面是调用处代码:

<pre name="code" class="html">Retrofit <span style="font-family: Arial, Helvetica, sans-serif;">retrofit = new Retrofit.Builder()</span>
.baseUrl("http://www.weather.com.cn/" )
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create())//用于返回Rxjava调用,非必须 .addConverterFactory(JacksonConverterFactory.create()) //可以换成GsonconverterFactory.create() .client(okHttpClient) //可以自己创建okhttpclient,或默认的 .build();

 

IWeatherService service = retrofit.create(IWeatherService.class);
        Call<WeatherBean> call = service.getWeather();
        call.enqueue(new Callback<WeatherBean>() {
            @Override
            public void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {
                WeatherBean bean = response.body();
                
            }

            @Override
            public void onFailure(Call<WeatherBean> call, Throwable t) {

            }
        });


1、创建Retrofit对象,设置json解析类型,okhttpclient对象,calladapter等。

2、通过retrofit对象,用动态代理模式创建特定的接口服务对象,就是前面我们定义的接口。

3、通过service接口对象调用里面的getWeather()方法,得到返回值Call<WeatherBean>类型的call对象。

4、调用call对象的异步任务enqueue方法,传递回调参数。

5、在onResponse回调里面,调用response.body()方法,得到我们需要的java 对象。在此处,我们不需要再手动解析json了,前边已经设置了jackson的方式解析json。系统在返回的过程中解析了json,生成对应的java对象返回给我们了。



基本的使用就完毕了。下面看RxJava怎么用。


Rxjava


IWeatherService接口中的方法,需要修改对应的返回值,



Observable是被观察者的含义。其实Rxjava是基于观察者模式的异步任务事件发布订阅框架,请自行查资料,我了解的也不多。




看下面的调用方式:

Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(HttpServerConfig.server)
                    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//用于返回Rxjava调用
                    .addConverterFactory(JacksonConverterFactory.create())
                    .client(okHttpClient)
                    .build();


IWeatherService service =  retrofit.create(IWeatherService.class);
        service.getWeatherRxJava().subscribeOn(Schedulers.io())//这连续几个方法都是RxJava里面的。任务在子线程调用
                .observeOn(AndroidSchedulers.mainThread())//AndroidSchedulers是RxAndroid里面的类。回调在android主线程
                .subscribe(new Subscriber<WeatherBean>() {//回调参数
                    @Override
                    public void onCompleted() {
<span style="white-space:pre">			</span>
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(WeatherBean weather) {
                        
                    }
                });
因为RxJava是链式的异步任务,可以添加任务,故没完成一个就掉调用一下onNext方法。当所有的任务都执行完成后,才会执行onCompleted方法。如果中间某个任务出错,则会执行onError方法,同时后面所有待执行的任务全部终止。

一般情况下我们只处理onNext和onError方法即可。


over,RxJava的简单实用,在Retrofit的基础上做简单修改即可。但Rxjava的功能和用法不止如此,内容很多。

.observeOn(AndroidSchedulers.mainThread())
上面这一部分也就是RxJava对android的扩展部分。即用到了RxAndroid



sorry,忘了附上demo,需要的请留言qq吧。



  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值