序
前段时间了解到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);因为RxJava是链式的异步任务,可以添加任务,故没完成一个就掉调用一下onNext方法。当所有的任务都执行完成后,才会执行onCompleted方法。如果中间某个任务出错,则会执行onError方法,同时后面所有待执行的任务全部终止。
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) {
}
});
一般情况下我们只处理onNext和onError方法即可。
over,RxJava的简单实用,在Retrofit的基础上做简单修改即可。但Rxjava的功能和用法不止如此,内容很多。
.observeOn(AndroidSchedulers.mainThread())上面这一部分也就是RxJava对android的扩展部分。即用到了RxAndroid
sorry,忘了附上demo,需要的请留言qq吧。