简化的mvp架构:FinalMvp

jopen 8年前

FinalMvp

mvp模式介绍

   由图可见,mvp模式将分为View、presenter、model,而presenter将连接View和model,    view和model之间不允许直接交互.    将view和model完全隔绝,可以说完全解决了耦合性的问题。    道理很容易理解,可是要想真正做好却不那么容易!

finaMvp介绍

  finalMvp是为了轻松使用mvp模式开发,并且规范mvp代码而编写的框架。    该框架的结构为:BaseView BasePresenter BaseModel    代码中直接继承这三类,变可以轻松实现mvp分层    finalMvp架构模型图:  

代码实现

 1、activity继承BaseView      onDataChanage()//当数据变化时通知此方法      onChanageUi()//presenter可以直接发送修改ui指令,在onChangeUi接收      编辑数据字段加上注解@ViewData,presenter会使用依赖注入修改数据   2、编辑presenter继承BasePresenter      initModel()//初始化model      onModelCallBack//数据返回后的监听      执行loadData()//请求数据,会发送到model的loadData      执行setDataChanage(data)//将view中标注@ViewData的数据值修改为data,并通知view改变ui   3、编辑model继承BaseModel      loadData(tag,msg)//加载数据      chanageData(tag,data)//数据加载完成后调用这个方法

demo代码

Activity编辑实现BaseView

public class MainActivity extends Activity implements BaseView{      private MainPresenter preseneter;      private TextView tv;      /**       * ViewData便是数据源注解,通过此注解可以自动修改值       */      @ViewData      public String data="aaaaaaaaaaaaaaaaaaaaaaa";      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          preseneter=new MainPresenter(this);          tv=new TextView(this);          setContentView(tv);          tv.setText(data);          tv.setOnClickListener(new OnClickListener() {              @Override              public void onClick(View v) {                  preseneter.chanageTextView();              }          });      }      @Override      public void onDataChanage() {          tv.setText(data);      }      @Override      public void onChanageUi(int tag) {      }  }

MainPresenter继承BasePresenter

public class MainPresenter extends BasePresenter{      private final int TAG_LOAD_DATA=1;      public MainPresenter(BaseView view) {          super(view);      }      public void chanageTextView(){          loadData(TAG_LOAD_DATA, "http://xxxxx");      }      /**       * 初始化model       */      @Override      public BaseModel initModel() {          return new MainModel();      }      @Override      public void onModelCallBack(int tag, Object obj) {          switch (tag) {          case TAG_LOAD_DATA:              /**               * 执行setDataChange,代码便会将BaseView中的注解的值替换为obj,               * 并执行BaseView下的onDataChanage方法,通知BaseView修改ui               */              setDataChanage(obj);              break;          }      }  }

MainModel继承BaseModel

public class MainModel extends BaseModel{      @Override      public void loadData(final int tag, String msg) {          new Thread(){              public void run() {                  //执行耗时操作,如执行http请求,从sqlite中读取或计算数据                  try {                      Thread.sleep(1000);                  } catch (InterruptedException e) {                      e.printStackTrace();                  }                  //返回得到计算后的数据,将数据返回                  chanageData(tag, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb");              };          }.start();      }  }

项目主页:http://www.open-open.com/lib/view/home/1447305964725