Android 快速搭建MVP框架

一、为什么用?

优点:

1、代码逻辑简洁

2、降低耦合、方便维护

缺点:

代码可能会比MVC多,层次更复杂一些,但是省去了在大篇幅中找代码的烦恼

二、怎么用

1、先看目录

2、实现base类

  BaseModel和BaseView我这里没有公用的,所以是空的类,BaseView是个接口类

BasePresenter类

public abstract class BasePresenter<V extends BaseView> {

    private V mView;

    public V getView() {

        return mView;
    }

    /**
     * 绑定view
     *
     * @param v
     */
    public void attachView(V v) {
        mView = v;
    }

    /**
     * 解绑view
     */
    public void detachView() {
        mView = null;
    }
}

BaseActivity

public abstract class BaseActivity<V extends BaseView, P extends BasePresenter<V>>
        extends AppCompatActivity {

    private P mPresenter;
    private V mView;

    public P getmPresenter() {
        return mPresenter;
    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutId());
        if (mPresenter == null) {
            mPresenter = createPresenter();
        }
        if (mView == null) {
            mView = createView();
        }

        if (mPresenter != null && mView != null) {
            mPresenter.attachView(mView);
        }

        init();
    }

    public abstract int getLayoutId();

    public abstract P createPresenter();

    public abstract V createView();

    public abstract void init();

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mPresenter != null) {
            mPresenter.detachView();
        }
    }
}
BaseFragment
public abstract class BaseFragment<V extends BaseView, P extends BasePresenter<V>> extends Fragment {

    private P presenter;
    private V view;
    private Context mContext;

    public P getPresenter() {
        return presenter;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(getlayoutId(), container, false);

        mContext = getActivity();
        if (presenter == null) {
            presenter = createPresenter();
        }

        if (this.view == null) {
            this.view = createView();
        }

        if (presenter != null && view != null) {
            presenter.attachView(this.view);
        }

        init();

        return view;
    }

    protected abstract int getlayoutId();

    protected abstract void init();

    protected abstract V createView();

    protected abstract P createPresenter();

    @Override
    public void onDestroyView() {
        super.onDestroyView();

        if (presenter != null) {
            presenter.detachView();
        }
    }
}

3、使用以MainActivity为例

先创建节点类  MainContact

public interface MainContact {

    interface View extends BaseView {
        void showMessage(String msg);
    }

    abstract class Presenter extends BasePresenter<View> {
        public abstract void getMessage(String id, String name);
    }

    abstract class Model extends BaseModel {
        public abstract void login(String name, String id, LoginInterface loginInterface);
    }
}

创建 MainModel类

public class MainModel extends MainContact.Model {
    @Override
    public void login(String name, String id, LoginInterface loginInterface) {
        //持久化操作,或者请求网络
        if (name.equals("123") && id.equals("123")) {
            loginInterface.loginResult("成功");
        } else {
            loginInterface.loginResult("失败");
        }
    }

}

创建 MainPresenter类

public class MainPresenter extends MainContact.Presenter {
    private MainModel mainModel;

    public MainPresenter() {
        mainModel = new MainModel();
    }

    @Override
    public void getMessage(String id, String name) {
        mainModel.login(name, id, new LoginInterface() {
            @Override
            public void loginResult(String msg) {
                getView().showMessage(msg);
            }
        });
    }
}
实现MainActivity类
public class MainActivity extends
        BaseActivity<MainContact.View, MainContact.Presenter> implements MainContact.View {

    Button btn_test;

    @Override
    public int getLayoutId() {
        return R.layout.activity_main;
    }

    @Override
    public MainContact.Presenter createPresenter() {
        return new MainPresenter();
    }

    @Override
    public MainContact.View createView() {
        return this;
    }

    @Override
    public void init() {
        btn_test = findViewById(R.id.test);

        btn_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getmPresenter().getMessage("123", "123");
            }
        });
    }

    @Override
    public void showMessage(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }
}
/**
 * 得到结果
 */
public interface LoginInterface {
    void loginResult(String msg);
}

以上就是我的mvp类所有实现,如果有啥不对或者更好的改进欢迎留言

源代码在我的资源中有

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值