Android之Mvp模式框架搭建

作者: sweetying | 来源:发表于2018-05-08 22:28 被阅读193次

    前言

    在做Android开发时,我们通常为了更合理,更高效,优质的开发项目,并不是直接上来就开始开发功能,而是先搭建好自己的一个开发框架,一个好的开发框架,通常会让我们事倍功半,它就好比我们去建造一个房子,如果你的地基打的越深,越牢固,那么就可以建造出很高很大的房子.

    在搭建一个框架前,我们先要考虑一下,这个框架要达到一个什么样的效果,主要从下面三点来进行考虑:

    1. 降低项目的复杂度
    2. 易扩展,易修改,可用性强,可维护性强
    3. 职责单一,功能清晰

    Mvp模式介绍

    优势

    • 分离了视图逻辑和业务逻辑,降低了耦合。
    • Activity只处理生命周期的任务,代码变得更加简洁。
    • 视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中,提高代码的阅读性。
    • Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试。
    • 把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存
      泄露和OOM。

    实际应用

    框架图

    此图是我搭建Mvp模式的一个架构图,V层与M层分离,通过P层来建立联系,V层主要显示UI,M层进行网络请求,数据库等操作,P层作为一个中心管理器,连接M层和V层.

    分包

    如下图:


    image.png
    1. base 存放app的基类
    2. common 存放一些常量,接口,公用的东西
    3. contract 连接V层和P层的一个契约包
    4. model M层,数据库,网络请求,服务等业务操作
    5. presenter P层,负责连接V层和M层,中心管理器
    6. ui V层,负责UI的展示
    7. utils 存放工具类
    8. widget 存放自定义的一些组件

    步骤介绍

    第一步 编写基类BaseActivity,BasePresenter,IBasePresenter,IBaseView

    IBasePresenter代码如下:

    public interface IBasePresenter<V extends IBaseView> {
    /**
     * 绑定View
     * @param mView
     */
     void attachView(V view);
    }
    

    IBaseView代码如下:

    public interface IBaseView {
    
    }
    

    BasePresenter代码如下:

    public abstract class BasePresenter<V extends IBaseView> implements IBasePresenter<V> {
    
    //数据管理,负责M层的业务逻辑操作
    protected DataManager mDataManager;
    //V层的引用
    protected V mView;
    
    /**
     * 初始化DataManager
     */
    public BasePresenter(){
        //数据库
         AppDbHelper appDbHelper = new DbHelper();
         //共享参数存储
         AppPreferenceHelper appPreferenceHelper = new PreferenceHelper();
         //网络请求
         AppApiHelper appApiHelper = new ApiHelper();
         mDataManager = new DataManager(appDbHelper, appApiHelper, appPreferenceHelper);
    }
    
    /**
     * 绑定view
     * @param view
     */
    @Override
    public void attachView(V view) {
        this.mView = view;
    }
    }
    

    BaseActivity代码如下:

    public abstract class BaseActivity<P extends IBasePresenter> extends AppCompatActivity implements IBaseView{
    
    //P层的应用
    protected P mPresenter;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        
        //初始化mPresenter
        initPresenter();
        
        //绑定view
        if(mPresenter != null){
            mPresenter.attachView(this);
        }
        //初始化
        initView();
    }
    
    /**
     * 初始化mPresenter
     */
    protected abstract void initPresenter();
    
    /**
     * 初始化
     */
    protected abstract void initView();
    
    /**
     * 获取布局id
     * @return
     */
    protected abstract int getLayoutId();
    }
    

    第二步 编写测试类MainActivity(V),MainContract(契约),MainPresenter(P),DataManager(M)

    MainActivity代码如下:

    public class MainActivity extends BaseActivity<MainPresenter> implements MainContract.View {
    
    
    @Override
    protected void initPresenter() {
        mPresenter = new MainPresenter();
    }
    
    @Override
    protected void initView() {
        mPresenter.testGetMpresenter();
        mPresenter.testDb();
        mPresenter.testRequestNetwork();
        mPresenter.testPreference();
    }
    
    @Override
    protected int getLayoutId() {
        return R.layout.activity_main;
    }
    
    @Override
    public void testGetMview() {
        Log.d("print", "我是V层的引用");
    }
    }
    

    MainPresenter代码如下:

    public class MainPresenter extends BasePresenter<MainContract.View> implements MainContract.Presenter{
    
    
    @Override
    public void testGetMpresenter() {
        Log.d("print", "我是P层的引用");
        mView.testGetMview();
    }
    
    @Override
    public void testDb() {
        mDataManager.testDb();
    }
    
    @Override
    public void testRequestNetwork() {
        mDataManager.testRequestNetwork();
    }
    
    @Override
    public void testPreference() {
        mDataManager.testPreference();
    }
    }
    

    MainContract代码如下:

    public interface MainContract {
    
    interface View extends IBaseView{
        void testGetMview();
    }
    
    interface Presenter extends IBasePresenter<View>{
        void testGetMpresenter();
    
        void testDb();
    
        void testRequestNetwork();
    
        void testPreference();
    }
    }
    

    DataManager代码如下:

    public class DataManager implements AppDbHelper,AppApiHelper,AppPreferenceHelper{
    private AppDbHelper mAppDbHelper;
    private AppApiHelper mAppApiHelper;
    private AppPreferenceHelper mAppPreferenceHelper;
    
    public DataManager(AppDbHelper mAppDbHelper, AppApiHelper appApiHelper, AppPreferenceHelper appPreferenceHelper) {
        this.mAppDbHelper = mAppDbHelper;
        this.mAppApiHelper = appApiHelper;
        this.mAppPreferenceHelper = appPreferenceHelper;
    }
    
    
    @Override
    public void testDb() {
        mAppDbHelper.testDb();
    }
    
    @Override
    public void testRequestNetwork() {
        mAppApiHelper.testRequestNetwork();
    }
    
    @Override
    public void testPreference() {
        mAppPreferenceHelper.testPreference();
    }
    }
    

    第三步 编写数据库,网络请求等类

    AppDbHelper代码如下:

    public interface AppDbHelper {
    void testDb();
    }
    

    DbHelper代码如下:

    public class DbHelper implements AppDbHelper{
    @Override
    public void testDb() {
        Log.d("print", "数据库操作");
    }
    }
    

    AppApiHelper代码如下:

    public interface AppApiHelper {
    void testRequestNetwork();
    }
    

    ApiHelper代码如下:

    public class ApiHelper implements AppApiHelper{
    
    @Override
    public void testRequestNetwork() {
        Log.d("print", "网络请求操作");
    }
    }    
    

    AppPreferenceHelper代码如下:

    public interface AppPreferenceHelper {
    void testPreference();
    }
    

    PreferenceHelper代码如下:

    public class PreferenceHelper implements AppPreferenceHelper{
    
    @Override
    public void testPreference() {
        Log.d("print", "共享参数存储操作");
    }
    }
    

    运行效果图:


    效果图

    总结

    Mvp模式在Android开发中被使用的越来越多,尤其是配合RxJava+Retrofit+Okhttp+Dagger2+Glide等第三方开源库,好处不用多说,所以大家赶紧都用起来吧,最后附上Mvp模式Demo

    如果大家对我的文章感兴趣的话,请给我点个赞!!!

    相关文章

      网友评论

        本文标题:Android之Mvp模式框架搭建

        本文链接:https://www.haomeiwen.com/subject/eubbrftx.html