使用android的框架,首先我们应该了解,使用框架的目的。框架最终的目的就是增强项目代码的可读性,维护性和方便测试。
要解决这三个问题,核心思想就是两种,一种是分层,一个是模块化。两个方法的目的就是为了解耦。
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();
}
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 是作为业务层,对获取到的数据进行拼装,然后交给调用层。