对于 MVP 架构我想大家都不陌生吧, 对于现在的主流框架非 MVP + RxJava + Retrofit 莫属了, GitHub 上也有很多优秀的开源项目对其进行了很好的封装有时候看一些优秀的开源项目是一种享受, 但自己如果能从这里学到并实现一些自己想实现的需求我想那更是一种享受这里很简单的去实现一个 MVP 的基类, 其它扩展功能可以自行添加
- Model
- public abstract class BaseModel {
- }
- Presenter
- public abstract class BasePresenter < M,
- V > {
- public M mIModle;
- public V mIView;
- public void attachV(V v) {
- this.mIView = v;
- if (mIModle == null) {
- mIModle = createModel();
- }
- }
- // 当 View 被销毁掉时删除 Presenter 层对 View 层的引用
- public void detachV() {
- mIView = null;
- }
- public abstract M createModel();
- }
- View
- public interface IBaseView {
- }
- @SuppressLint("Registered")
- public abstract class BaseMvpActivity<P extends BasePresenter> extends AppCompatActivity implements IBaseView{
- public P mPresenter;
- @Override
- protected void onCreate(@Nullable Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- if (mPresenter == null) {
- mPresenter = createPresenter();
- }
- mPresenter.attachV(this);
- }
- // 当 View 被销毁掉时删除 Presenter 层对 View 层的引用
- @Override
- protected void onDestroy() {
- super.onDestroy();
- mPresenter.detachV();
- }
- public abstract P createPresenter();
- }
这里 Mode 和 View 的基类里什么都没有, 其实我们知道一般封装基类的目录是为了简化项目代码, 提高开发效率所以这里两个基类里面一般根据我们自己需求去实现
- Example
- public interface ExampleDataSource {
- interface OnExampleFinishListener {
- void loading();
- void onSuccess();
- void onError();
- }
- void load(OnExampleFinishListener listener);
- }
ExampleDataSource 接口实现的是 ExampleModel, 而在它的内部接口 OnExampleFinishListener 是 Model 层的回调接口, 它们真正实现是在 Presenter 层对于获取到数据后 (成功或失败) 就是通过这个回调接口将数据传递 Presenter 层
- public class ExampleModel extends BaseModel implements ExampleDataSource {
- /**
- * model 层主要用来进行数据存储操作, 例如: 数据读写和网络请求
- * 这里进行下模拟耗时操作
- * @param listener
- */
- @Override
- public void load(final OnExampleFinishListener listener) {
- // 加载中状态
- listener.loading();
- new Handler().postDelayed(new Runnable() {
- @Override
- public void run() {
- // 获取成功后进行回调
- listener.onSuccess();
- }
- },2000);
- }
- }
这里我们在 Model 层模拟下耗时操作(例如: 网络请求), 然后将得到的数据结果通过回调方法传递到 Presenter 层
- public interface ExampleContract extends IBaseView {
- interface ExamplePresent {
- void loadData();
- }
- interface ExampleView {
- void loadResult(String result);
- void showLoading();
- void loadFinish();
- }
- }
这里我们将 Presenter 接口和 View 接口放在一个类中, 这样可以使我们能够清晰的看到在 Presenter 层和 View 层中有哪些功能, 方便我们以后维护
- public class ExamplePresenter extends BasePresenter<ExampleModel,ExampleContract.ExampleView> implements ExampleContract.ExamplePresent,ExampleDataSource.OnExampleFinishListener{
- @Override
- public void loadData() {
- mIModle.load(this);
- }
- @Override
- public void loading() {
- mIView.showLoading();
- }
- @Override
- public void onSuccess() {
- mIView.loadResult("成功");
- mIView.loadFinish();
- }
- @Override
- public void onError() {
- }
- @Override
- public ExampleModel createModel() {
- return new ExampleModel();
- }
- }
从 Presenter 层我们可以看出, 首先调用 Model 层的接口获取数据进行一些逻辑操作然后通过 View 层接口实现数据的展示
- public class MainActivity extends BaseMvpActivity<ExamplePresenter> implements ExampleContract.ExampleView {
- private TextView tvName;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- tvName = findViewById(R.id.tv_name);
- // 加载数据
- mPresenter.loadData();
- }
- @Override
- public ExamplePresenter createPresenter() {
- return new ExamplePresenter();
- }
- // 返会数据结果
- @Override
- public void loadResult(String result) {
- tvName.setText(result);
- }
- // 加载过程
- @Override
- public void showLoading() {
- tvName.setText("正在加载, 请稍等");
- }
- // 加载结束
- @Override
- public void loadFinish() {
- }
- }
嗯, 好了! 一个很简单的 MVP 基类就实现了, 对于使用轮子来说, 我们更应该试着一点点自己去实现它, 从简单到复杂慢慢就会更加的了解它贴上项目源码更参考
来源: http://www.jianshu.com/p/2f81197b5798