MVP+Retrofit2+RxJava使用方法demo

时间:2020-12-02 21:14:15

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



正题

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

MVP+Retrofit2+RxJava使用方法demo

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

此demo的结构:

MVP+Retrofit2+RxJava使用方法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扩展库中就会导入相关的依赖库:

MVP+Retrofit2+RxJava使用方法demo


用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接口中的方法,需要修改对应的返回值,

MVP+Retrofit2+RxJava使用方法demo


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吧。