一步一步的实现Android的mvp框架
2016-08-02 14:04
232 查看
使用android的框架,首先我们应该了解,使用框架的目的。框架最终的目的就是增强项目代码的可读性,维护性和方便测试。
要解决这三个问题,核心思想就是两种,一种是分层,一个是模块化。两个方法的目的就是为了解耦。
![](http://mmbiz.qpic.cn/mmbiz/tnZGrhTk4ddhHERic8lXLaTpb6u4qbWfFmFUs1lhqJxlLwNaPT6SKkI6PxTZPZPqK9I6Wdc6XMa1kYksvPKzTLg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1)
mvc框架,简单的来理解就是,Activity或者Fragment直接与数据层交互,activity通过api Provider进行网络访问,或者通过cache provider读取本地缓存,然后再返回或者回调里对Activity的界面进行相应刷新。
我们做一个一个设想,加入一次数据访问可能需要同时访问api和cache,或者一次数据请求需要请求两次api。对于activity来说,它即与界面的展示,事件等有关系,又与业务数据层有着直接的关系,无疑activity层会急剧膨胀,变得极难阅读和维护。在这种结构下,activity同时承担了view层和controller层的工作,所以我们需要给activity减负。
mvp的网络层次模型:
![](http://mmbiz.qpic.cn/mmbiz/tnZGrhTk4ddhHERic8lXLaTpb6u4qbWfFDf4yHukskbmDAAibx0Eshp9EMtPB3c9X6kOw27O0xtw6ySHrEa7siawg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1)
看一个简单的小例子,如下所示。
public class MainActivity extends Activity implements MainView{
MainPresenter presenter;
TextView mShowTxt;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mShowText=(TextView)findViewById(R.id.text1);
loadDatas();
}
public void loadDatas(){
presenter = new MainPresenter();
presenter.addTaskListerer(this);
presenter.getString();
}
@Override
public void onShowString(String str){
mShowTxt.setText(str);
}
}
Activity里面包含了几个文件,一个是View层的对外接口MainView,一个是P层Presenter。
首先对外接口MainView文件。
public interface MainView{
void onShowString(String json);
}
Presenter层的文件如下。
public class MainPresenter {
MainView mainView;
TaskManager taskData;
public MainPresenter() {
this.taskData = new TaskManager(new TaskDataSourceImpl());
}
public MainPresenter test() {
this.taskData = new TaskManager(new TaskDataSourceTestImpl());
return this;
}
public MainPresenter addTaskListener(MainView viewListener) {
this.mainView = viewListener;
return this;
}
public void getString() {
String str = taskData.getTaskName();
mainView.onShowString(str);
}
}
可以单刀Presenter层是连接Model层和View层的中间层,因此持有View层的接口和Model层的接口,这里就可以看到MVP的优势了。
DataManager.java
<pre name="code" class="java">/**
* 从数据层获取的数据,在这里进行拼装和组合
*/public class TaskManager {
TaskDataSource dataSource;
public TaskManager(TaskDataSource dataSource) {
this.dataSource = dataSource;
}
public String getShowContent() {
//Todo what you want do on the original data
return dataSource.getStringFromRemote() + dataSource.getStringFromCache();
}
}
TaskDataSource.java文件
/**
* data 层接口定义
*/
public interface TaskDataSource {
String getStringFromRemote();
String getStringFromCache();
}
TaskDataSourceImpl.java文件
public class TaskDataSourceImpl implements TaskDataSource {
@Override
public String getStringFromRemote() {
return "Hello ";
}
@Override
public String getStringFromCache() {
return "World";
}
}
TaskDataSourceTestImpl.java
public class TaskDataSourceTestImpl implements TaskDataSource {
@Override
public String getStringFromRemote() {
return "Hello ";
}
@Override
public String getStringFromCache() {
return " world Test ";
}
}
从上面几个文件来看, TaskDataSource.java 作为数据层对外的接口, TaskDataSourceImpl.java 是数据层,直接负责数据获取,无论是从api获得,还是从本地数据库读取数据,本质上都是IO操作。
TaskManager 是作为业务层,对获取到的数据进行拼装,然后交给调用层。
要解决这三个问题,核心思想就是两种,一种是分层,一个是模块化。两个方法的目的就是为了解耦。
mvc框架,简单的来理解就是,Activity或者Fragment直接与数据层交互,activity通过api Provider进行网络访问,或者通过cache provider读取本地缓存,然后再返回或者回调里对Activity的界面进行相应刷新。
我们做一个一个设想,加入一次数据访问可能需要同时访问api和cache,或者一次数据请求需要请求两次api。对于activity来说,它即与界面的展示,事件等有关系,又与业务数据层有着直接的关系,无疑activity层会急剧膨胀,变得极难阅读和维护。在这种结构下,activity同时承担了view层和controller层的工作,所以我们需要给activity减负。
mvp的网络层次模型:
看一个简单的小例子,如下所示。
public class MainActivity extends Activity implements MainView{
MainPresenter presenter;
TextView mShowTxt;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mShowText=(TextView)findViewById(R.id.text1);
loadDatas();
}
public void loadDatas(){
presenter = new MainPresenter();
presenter.addTaskListerer(this);
presenter.getString();
}
@Override
public void onShowString(String str){
mShowTxt.setText(str);
}
}
Activity里面包含了几个文件,一个是View层的对外接口MainView,一个是P层Presenter。
首先对外接口MainView文件。
public interface MainView{
void onShowString(String json);
}
Presenter层的文件如下。
public class MainPresenter {
MainView mainView;
TaskManager taskData;
public MainPresenter() {
this.taskData = new TaskManager(new TaskDataSourceImpl());
}
public MainPresenter test() {
this.taskData = new TaskManager(new TaskDataSourceTestImpl());
return this;
}
public MainPresenter addTaskListener(MainView viewListener) {
this.mainView = viewListener;
return this;
}
public void getString() {
String str = taskData.getTaskName();
mainView.onShowString(str);
}
}
可以单刀Presenter层是连接Model层和View层的中间层,因此持有View层的接口和Model层的接口,这里就可以看到MVP的优势了。
DataManager.java
<pre name="code" class="java">/**
* 从数据层获取的数据,在这里进行拼装和组合
*/public class TaskManager {
TaskDataSource dataSource;
public TaskManager(TaskDataSource dataSource) {
this.dataSource = dataSource;
}
public String getShowContent() {
//Todo what you want do on the original data
return dataSource.getStringFromRemote() + dataSource.getStringFromCache();
}
}
TaskDataSource.java文件
/**
* data 层接口定义
*/
public interface TaskDataSource {
String getStringFromRemote();
String getStringFromCache();
}
TaskDataSourceImpl.java文件
public class TaskDataSourceImpl implements TaskDataSource {
@Override
public String getStringFromRemote() {
return "Hello ";
}
@Override
public String getStringFromCache() {
return "World";
}
}
TaskDataSourceTestImpl.java
public class TaskDataSourceTestImpl implements TaskDataSource {
@Override
public String getStringFromRemote() {
return "Hello ";
}
@Override
public String getStringFromCache() {
return " world Test ";
}
}
从上面几个文件来看, TaskDataSource.java 作为数据层对外的接口, TaskDataSourceImpl.java 是数据层,直接负责数据获取,无论是从api获得,还是从本地数据库读取数据,本质上都是IO操作。
TaskManager 是作为业务层,对获取到的数据进行拼装,然后交给调用层。
相关文章推荐
- 【腾讯Bugly干货分享】一步一步实现Android的MVP框架
- 【腾讯Bugly干货分享】一步一步实现Android的MVP框架
- 如何一步一步实现Android的MVP框架
- Android开发truck快速开发框架MVP实现(二)
- android MVP + dagger2 + Retrofit + Rxjava+okhttp android基础项目框架搭建(3)--完美实现
- 【Android 进阶(一)】Android MVP框架实现过程
- Android实战(橘子娱乐)-首页(第一篇 MVP框架基本搭建和实现准备)
- Android 框架设计Demo,一个简单的MVP示例搜索功能,网络请求用Retrofit+RxJava实现
- 实现Android的MVP框架
- 如何实现自己的Android MVP框架?
- android平台phonegap框架实现原理
- Google应用在Android上的Push机制以及C2DM框架的底层实现
- C#一步一步实现插件框架的示例(二)
- C#一步一步实现插件框架的示例(四)
- C#一步一步实现插件框架的示例(四)
- C#一步一步实现插件框架的示例(三)
- Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效
- Android应用程序窗口(Activity)实现框架简要介绍和学习计划
- android iphone手机服务端接口(php实现,使用框架fat-free,解说例子blog)
- 第四篇 ANDROID窗口管理服务实现机制 窗口管理是ANDROID框架一个重要部分,主要包括如下功能: (1)Z-ordered的维护 (2)窗口的创建、销