欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-06-01 20:32:10
android 搭建mvp+retrofit+rxjava网络请求框架 下面我们来看一下rxjava和retrofit的结合使用,为了使rxjava与retrofit结合,我们需要在retrofit...

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的功能也很简单,就是点击按钮调用上面的那个测试接口,将请求下来书的信息显示在屏幕上。首先我们来看一下这个工程的目录结构:

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

我们可以看到,在项目的包名下,我们建了主要的文件夹: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