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

1 篇文章 0 订阅

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



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值