您的位置:首页 > 编程语言 > Java开发

MVP+Retrofit2+RxJava使用方法demo

2016-07-10 21:49 507 查看
序前段时间了解到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>() {@Overridepublic void onResponse(Call<WeatherBean> call, Response<WeatherBean> response) {WeatherBean bean = response.body();}@Overridepublic 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怎么用。RxjavaIWeatherService接口中的方法,需要修改对应的返回值,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>() {//回调参数@Overridepublic void onCompleted() {<span style="white-space:pre">			</span>}@Overridepublic void onError(Throwable e) {}@Overridepublic void onNext(WeatherBean weather) {}});
因为RxJava是链式的异步任务,可以添加任务,故没完成一个就掉调用一下onNext方法。当所有的任务都执行完成后,才会执行onCompleted方法。如果中间某个任务出错,则会执行onError方法,同时后面所有待执行的任务全部终止。一般情况下我们只处理onNext和onError方法即可。over,RxJava的简单实用,在Retrofit的基础上做简单修改即可。但Rxjava的功能和用法不止如此,内容很多。
.observeOn(AndroidSchedulers.mainThread())
上面这一部分也就是RxJava对android的扩展部分。即用到了RxAndroidsorry,忘了附上demo,需要的请留言qq吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: