一步一步的实现Android的mvp框架

来源:互联网 发布:单片机usb通讯 编辑:程序博客网 时间:2024/05/18 01:39

使用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();}


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 是作为业务层,对获取到的数据进行拼装,然后交给调用层。



1 0