RxJava2+Retrofit2+RxLifecycle2+OkHttp3 封装RHttp 使用MVP模式构建项目

本文介绍了一个基于RHttp和MVP模式的项目架构。RHttp是集成了RxJava2、Retrofit2等框架的网络请求库,支持常见的HTTP方法、文件上传下载等功能;MVP模式则通过Presenter连接View和Model,实现模块间的解耦。

Rx-Mvp

项目使用 RHttp + MVP 模式构建

RHttp

RHttp 是基于 RxJava2 + Retrofit2 + OkHttp3 + RxLifecycle2 框架整合封装的网络请求框架

  • 基本的get、post、put、delete、4种请求
  • 单/多文件上传
  • 断点续传下载
  • 基本回调包含 onSuccess、onError、onCancel、onProgress(上传/下载)
  • 支持自定义Callback
  • 支持https
  • 支持tag取消,也可取消全部
  • 支持链式调用
  • 支持表单格式,String,json格式数据提交请求

RHttp 很屌吗?算不上,基本满足应用开发的所有需求,代码很简洁,体积小,功能齐全。这就够了

  1. 基于主流网络框架 Retrofit2 + OkHttp3 作为底层框架
  2. 使用 RxJava2 处理异步事件,线程间切换逻辑
  3. 使用 RxLifecycle2 管理生命周期,再也不用担心 RxJava 使用不当造成内存泄漏
  4. 基础网络请求,数据转换为 String 并提供 onConvert 方法提供开发者自定义转化数据
  5. 上传带进度回调,多文件情况下,可以区分当前文件下标
  6. 断点续传大文件,多种下载状态满足不同下载需求
        new RHttp.Builder()
                .post()                     //请求方式
                .apiUrl("user/login")       //接口地址
                .addParameter(parameter)    //参数
                .addHeader(header)          //请求头
                .lifecycle(this)            //自动管理生命周期,可以不传,如果未及时取消RxJava可能内存泄漏
                .build()
                .request(new HttpCallback<UserBean>() {
                    @Override
                    public UserBean onConvert(String data) {
                        /*数据解析转换*/
						//String 转为 Response(自定义)
                        Response response = new Gson().fromJson(data, Response.class);
						// Response 转为 JavaBean(目标对象)
                        UserBean userBean = new Gson().fromJson(response.getResult(), UserBean.class);
                        return userBean;
                    }

                    @Override
                    public void onSuccess(UserBean value) {
                        //do sth.
                    }

                    @Override
                    public void onError(int code, String desc) {
                        //do sth.
                    }

                    @Override
                    public void onCancel() {
  						//do sth.
                    }
                });
复制代码

RHttp 使用 demo文档

RHttp 详解文档

MVP

MVP 是 MVC 框架的升级版本,通过 Presenter 桥梁连接 View 和 Model,使得模块之间更好的解耦

定义BasePresenter<V, T>

public class BasePresenter<V, T> {

    protected Reference<V> mViewRef;
    protected V mView;
    protected Reference<T> mActivityRef;
    protected T mActivity;


    public BasePresenter(V view, T activity) {
        attachView(view);
        attachActivity(activity);
        setListener(activity);
    }

   
	/*关联*/	
    private void attachView(V view) {
        mViewRef = new WeakReference<V>(view);
        mView = mViewRef.get();
    }

	/*关联*/	
    private void attachActivity(T activity) {
        mActivityRef = new WeakReference<T>(activity);
        mActivity = mActivityRef.get();
    }

    /*解绑*/	
    private void detachView() {
        if (isViewAttached()) {
            mViewRef.clear();
            mViewRef = null;
        }
    }
    
	/*解绑*/	
    private void detachActivity() {
        if (isActivityAttached()) {
            mActivityRef.clear();
            mActivityRef = null;
        }
    }

    public V getView() {
        if (mViewRef == null) {
            return null;
        }
        return mViewRef.get();
    }

    public T getActivity() {
        if (mActivityRef == null) {
            return null;
        }
        return mActivityRef.get();
    }
}

复制代码

XXXPresenter

    class LoginPresenter extends BasePresenter<ILoginView, LifecycleProvider> {

        public LoginPresenter(ILoginView view, LifecycleProvider activity) {
            super(view, activity);
        }

		/*登录逻辑*/
        public void login(){
            new RHttp.Builder()
                    .post()
                    .apiUrl("user/login")
                    .addParameter(parameterMap)
                    .lifecycle(getActivity())
                    .build()
                    .request(new HttpCallback<UserBean>(){});
        }

    }
复制代码
定义View接口
	public interface ILoginView {

	    //显示结果
	    void showResult(UserBean bean);

	}
复制代码
Activity使用
    class XActivity extends RxActivity implements ILoginView{
        //登录Presenter
        LoginPresenter loginPresenter = new LoginPresenter(this, this);

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            loginPresenter.login();
        }

        @Override
        public void showResult(UserBean bean) {
            //update ui
        }
    }
复制代码

1. 有部分开发者可能会认为把 `UserBean` 实体传递给 `View(activity/fragment)` 还是会出现 `model` 跟 `view` 的耦合

2. 个人认为,不一定死脑筋非要完全解耦才是实现了 `MVP` 的模式,这里已经实现不关心 `UserBean` 的来源和构建就行了

3. 如果非要完全解耦也是可以的,将 UserBean 拆解成"基本数据类型" 
  `void showResult(String userName,int userId....)` 要用几个参数就定义几个参数,但是感觉太麻烦了

复制代码
   /**
     * 文档说明有限
     *
     * 强烈建议阅读代码,在此基础上改造成适用自己项目的框架
     *
     * 欢迎提供建议/意见,不断完善框架
     */

复制代码

Github 地址

原始构造想法参考博客 优快云博客地址:blog.youkuaiyun.com/u014702653/…

转载于:https://juejin.im/post/5b9875825188255c9f069e3f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值