当前位置: 移动技术网 > IT编程>移动开发>Android > Android 搭建MVP+Retrofit+RxJava网络请求框架解析

Android 搭建MVP+Retrofit+RxJava网络请求框架解析

2018年11月03日  | 移动技术网IT编程  | 我要评论

黄安瑜个人资料,近期电影上映,范范黑人婚纱照

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 observable = service.getsearchbook("人间失格", null, 0, 1);
其实这一步,就是创建了一个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都有对应的接口类相对应,这种写法虽然类增加了,但是便于解耦,改动和维护方便;
具体实现步骤如下:

  1. 创建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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网