Mvp+Retrofit+RxAndroid基础实例

本文介绍了MVP模式的基础应用,结合Retrofit和RxJava进行网络请求的实例。通过Presenter实现Model与View的解耦,详细阐述了如何在Presenter中处理数据和视图交互。同时,提供了retrofit的封装方法和相关依赖,包括get和post接口的测试,以及在项目中的角色分工:View层定义交互接口,Model层处理数据,Presenter作为连接层。
摘要由CSDN通过智能技术生成

项目结构:

项目目录结构
以上是可参考的一个项目目录结构

1.介绍

MVP模式的介绍这里就不仔细讲解了,这里给出一个链接
Retrofit是Square公司的又一个精品,具体介绍可以看官网
RxJava是最近比较流行的响应式编程,本篇文章是介绍使用实例,这些框架的具体用法可以参考使用文档等其他资料

2.实例讲解

Mvp模式不同于传统的MVC模式,它将model层和view层完全的解耦,利用Presenter来处理数据和视图的交互。做到了数据与界面的分离,与传统MVC相比,大大降低了view层的代码量。
MVP讲解图

所以项目大致思路是:presenter层获取view层的参数交给model层,并且model层获取presenter层传过来的subcriber来构造一个rxjava+retrofit方式的的网络请求,然后presenter层在回调的subcriber中获取数据,传递回view层,用于界面的显示交互使用。其中对retrofit网络请求框架进行了简单的封装。

3.代码块

说了这么多,没有代码也是一脸懵逼。所以,上干货!!!!!

先展示retrofit的封装:

项目对需要用到retrofit+rxjava的依赖:

compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.alibaba:fastjson:1.1.34.android'
compile 'org.ligboy.retrofit2:converter-fastjson-android:2.1.0'
compile 'io.reactivex:rxjava:1.1.0'
compile 'io.reactivex:rxandroid:1.1 .0'
compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0

其中使用的fastjson来作为结果的解析库

这里是我在自己的本地服务器环境写了两个测试接口,包了get和post两种请求方式的测试接口:
public interface CloudAPIService {
@Multipart
@POST("/api_user/add_repair.json")
Observable<ResponseBody> postAddRepair(@Part("teacher_phone") String phone, @Part("receiver_id") String receiverid, @Part("title") String title, @Part("attachment") File file);
// @FormUrlEncoded
@GET("/ztemp/testpost.json")
Observable<TempBean> postStr(@Query("str") String name);
}

http访问的retrofit封装:

public class HttpMethods {
private static final String TAG = "HttpMethods";
private static final String baseUrl = "http://192.168.0.109:8000/";
private static HttpMethods instance;
private Retrofit retrofit;
private CloudAPIService apiService;
private static OkHttpClient.Builder httpClientBuilder;
private static CookiesManager cookiesManager;

public static void initCookieHandler(Context context) {
    httpClientBuilder = new OkHttpClient.Builder();
    cookiesManager = new CookiesManager(context);
    httpClientBuilder.connectTimeout(5, TimeUnit.SECONDS).cookieJar(cookiesManager);
}

public static void logout() {
    if (cookiesManager != null) cookiesManager.removeAllCookies();
}

private HttpMethods(Context context) {
    retrofit = new Retrofit.Builder()
            .client(httpClientBuilder.build())
            .addConverterFactory(FastJsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .baseUrl(baseUrl).build();
    apiService = retrofit.create(CloudAPIService.class);
}

public static HttpMethods getInstance(Context context) {
    if (instance == null) instance = new HttpMethods(context);
    return instance;
}

public void post(Subscriber<ResponseBody> subscriber, String phone, String receiveId, String title, File file) {
    apiService.postAddRepair(phone, receiveId, title, file).subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);
}

public void getStr(Subscriber<TempBean> subscriber, String name) {
    apiService.postStr(name).subscribeOn(Schedulers.io())
            .unsubscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

   .subscribe(subscriber);

view层:写好界面可能的所有控件交互的接口,在activity中去实现,在presenter中去调用
public interface IMainView {
void showToast(String msg);
String getEtContent();
void setEtResult(String msg);
}

model层:处理数据的层,处理结果返回给presenter,presenter再传递给view层。

public class MainModel {
private Context context;
public MainModel(Context context) {
this.context = context;
}
public void postResult(Subscriber<TempBean> result, String name) {
HttpMethods.getInstance(context).postStr(result, name);
}
}

presenter:连接model层与view层的一个中间层
public class MainPresenter {
private static final String TAG = "MainPresenter";
private MainModel mModel;
private IMainView mView;
public MainPresenter(Context context, IMainView mView) {
this.mView = mView;
mModel = new MainModel(context);
}
public void postNameAndsetResult() {
if (TextUtils.isEmpty(mView.getEtContent())) mView.showToast("内容不可为空");
else mModel.postResult(new Subscriber<TempBean>() {
@Override
public void onCompleted() {
mView.showToast("completed!");
}
@Override
public void onError(Throwable e) {
Log.i(TAG, "onError: " + e);
mView.setEtResult(e.getMessage());
}
@Override
public void onNext(TempBean tempBean) {
Log.i(TAG, "onNext: " + tempBean);
mView.setEtResult(""+tempBean.getA());
}
}, mView.getEtContent());
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值