Android 搭建MVP+Retrofit+RxJava网络请求框架解析
android 搭建mvp+retrofit+rxjava网络请求框架
下面我们来看一下rxjava和retrofit的结合使用,为了使rxjava与retrofit结合,我们需要在retrofit对象建立的时候添加一句代码:
addcalladapterfactory(rxjava2calladapterfactory.create())
当然你还需要在build.gradle文件中添加如下依赖:
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
本篇中所用的是rxjava2,完整的代码如下:
retrofit retrofit = new retrofit.builder() .baseurl("https://api.douban.com/v2/") .addconverterfactory(gsonconverterfactory.create(new gsonbuilder().create())) .addcalladapterfactory(rxjava2calladapterfactory.create())//支持rxjava .build();
然后我们还需要修改retrofitservice 中的代码:
public interface retrofitservice { @get("book/search") observable getsearchbook(@query("q") string name, @query("tag") string tag, @query("start") int start, @query("count") int count);
可以看到,在原来的retrofitservice 中我们把getsearchbook方法返回的类型call改为了observable,也就是被观察者。其他都没变。然后就是创建retrofitservice 实体类:
retrofitservice service = retrofit.create(retrofitservice.class);
和上面一样,创建完retrofitservice ,就可以调用里面的方法了:
observable
其实这一步,就是创建了一个rxjava中observable,即被观察者,有了被观察者,就需要一个观察者,且订阅它:
observable.subscribeon(schedulers.io())//请求数据的事件发生在io线程 .observeon(androidschedulers.mainthread())//请求完成后在主线程更显ui .subscribe(new disposableobserver() {//订阅 @override public void oncomplete() { //所有事件都完成,可以做些操作。。。 } @override public void onerror(throwable e) { e.printstacktrace(); //请求过程中发生错误 } @override public void onnext(book book) {//这里的book就是我们请求接口返回的实体类 } }
在上面中我们可以看到,事件的消费在android主线程,所以我们还要在build.gradle中添加如下依赖:
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
这样我们就引入了rxandroid,rxandroid其实就是对rxjava的扩展。比如上面这个android主线程在rxjava中就没有,因此要使用的话就必须得引用rxandroid。
实践
接下来我们就看看,在一个项目中上面三者是如何配合的。我们打开android studio,新建一个项目取名为mvpsample。这个demo的功能也很简单,就是点击按钮调用上面的那个测试接口,将请求下来书的信息显示在屏幕上。首先我们来看一下这个工程的目录结构:
我们可以看到,在项目的包名下,我们建了主要的文件夹:bean、data、presenter,ui;分别对应不同的功能。其中app文件夹中可以建一个application类,用于设置应用全局的一些属性,这里为了使项目更加简单就没有添加;然后,我们再来看看ui文件夹下,这个文件夹下主要放一些关于界面的东西。在里面我们又建了三个文件夹:activity、adapter、fragment,我想看名字你就清楚里面要放什么了。retrofithelper和apiservice。retrofithelper主要用于retrofit的初始化:
public class retrofithelper { private context mcntext; okhttpclient client = new okhttpclient(); gsonconverterfactory factory = gsonconverterfactory.create(new gsonbuilder().create()); private static retrofithelper instance = null; private retrofit mretrofit = null; public static retrofithelper getinstance(context context){ if (instance == null){ instance = new retrofithelper(context); } return instance; } private retrofithelper(context mcontext){ mcntext = mcontext; init(); } private void init() { resetapp(); } private void resetapp() { mretrofit = new retrofit.builder() .baseurl(apiservice.base_url) .client(client) .addconverterfactory(factory) .addcalladapterfactory(rxjava2calladapterfactory.create()) .build(); } public apiservice getserver(){ return mretrofit.create(apiservice.class); } }
代码并不复杂,其中resetapp方法,就是前面介绍的retrofit的创建,getserver方法就是为了获取apiservice接口类的实例化。然后定义了一个静态方法getinstance用于获取自身retrofithelper的实例化,并且只会实例化一次。
在正式的项目中model,view,presenter都需要根据需求创建对应的baseview,basemodel,basepresenter;当前demo中只是简单创建,后再后续封装中继续完善框架。
先创建一个bookinfocontract
public interface bookinfocontract { interface iview extends baseview { void showresult(string msg); // void onrequestpermissionsuccess(); // // void onrequestpermissionserror(); } interface ibookmodel { observable getbookmsg(string name,string tag,int start,int count); } }
这是采用google官方demo的写法,将相关的view和model接口写到一个协议接口类中。方便查找和管理,每一个view,model,presenter都有对应的接口类相对应,这种写法虽然类增加了,但是便于解耦,改动和维护方便;
具体实现步骤如下:
- 创建bookinfomodel,实现接口,并重写获取数据的方法
public class bookinfomodel implements bookinfocontract.ibookmodel { private apiservice mapiservice; public bookinfomodel(apiservice mapiservice) { this.mapiservice = mapiservice; } @override public observable getbookmsg(string name, string tag, int start, int count) { return mapiservice.getsearchbooks(name, tag, start, count); } }
2.创建presenter,通过构造传入需要关联的view,并初始化model;在getmsg()方法中,通过model中
getbookmsg()方法返回的被观察者进入线程切换和事件订阅;在订阅回调中,调用view的方法对请求的结果进行处理;一般presenter持有view的引用,增加了耦合性,后面会进行优化处理public class bookpresenter { private bookinfocontract.iview mview; private bookinfomodel bookinfomodel; private book mbook; public bookpresenter(bookinfocontract.iview mview) { this.mview = mview; bookinfomodel = new bookinfomodel(retrofithelper.getinstance((context) mview).getserver()); } //获取数据 public void getmsg(string name, string tag, int start, int count) { bookinfomodel.getbookmsg(name, tag, start, count) .subscribeon(schedulers.io()) .observeon(androidschedulers.mainthread()) .subscribe(new observer() { @override public void onsubscribe(disposable d) { } @override public void onnext(book value) { mbook = value; } @override public void onerror(throwable e) { e.printstacktrace(); mview.showerror("请求失败"); } @override public void oncomplete() { if (mview != null) { mview.showresult(mbook.tostring()); } } }); } }
3.在mainactivity中实现接口 bookinfocontract.iview;通过注解初始化控件(在ondestroy中进行接触注解)并获取初始化presenter,在控件监听事件中。调用presenter的方法获取数据;
经过以上几步基本完成了mvp+rxjava+retrofit的框架搭建
项目地址:https://github.com/cruiseliang/mvpsample
下一篇: ios设置Cell的默认选中第一行
推荐阅读
-
Android 搭建MVP+Retrofit+RxJava网络请求框架解析
-
Android中搭建自己的项目网络框架
-
Android Retrofit2+rxjava2+Mvp基于okhttp3网络请求框架的使用 三 文件上传(支持多文件/多图片上传)
-
Android 网络请求框架Volley实例详解
-
Android 9.0 网络请求适配,加载网络图片用Glide框架网络权限配置配好了,还是加载不出来图片
-
Android 网络请求框架解析之okhttp与okio
-
Android网络请求框架(三) Retrofit配合RxJava
-
Android网络请求框架(四)Retrofit和RxJava的封装
-
带你一步步剖析Retrofit 源码解析:一款基于 OkHttp 实现的网络请求框架 android源码解析网络请求OKHTTPRetrofit
-
Android 搭建MVP+Retrofit+RxJava网络请求框架解析