当前位置: 首页 > news >正文

android-mvp模式

mvvm可以理解成使用databing的mvp模式,modleview

通过接口让view和Presenter层解耦

从图中就可以看出,最明显的差别就是view层和model层不再相互可知,完全的解耦,取而代之的presenter层充当了桥梁的作用,用于操作view层发出的事件传递到presenter层中,presenter层去操作model层,并且将数据返回给view层,整个过程中view层和model层完全没有联系。看到这里大家可能会问,虽然view层和model层解耦了,但是view层和presenter层不是耦合在一起了吗?其实不是的,对于view层和presenter层的通信,我们是可以通过接口实现的,具体的意思就是说我们的activity,fragment可以去实现实现定义好的接口,而在对应的presenter中通过接口调用方法。不仅如此,我们还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试。这就解决了MVC模式中测试,维护难的问题。
-----------------------------------
android开发mvp案例 安卓开发mvp
https://blog.51cto.com/u_14844/7436944

例子:

布局文件我就不介绍了,大家都能猜到了!
首先先看一下MainConstract ,MainConstract 里面包含了View、Model、Presenter三层的接口用于给对应的三层实现。把它写在一个类里是为了减少class文件的创建。

public class MainConstract {
    public interface IMainView {
        //刷新列表数据
        void refreshData(List<String> data);
        //刷新数据失败提示
        void showRefreshError();

    }
    public interface IMainModel {
        //访问网络获取数据模型
        void getListData(OnHttpCallBack<List<String>> onHttpCallBack);
    }

    public interface IMainPresenter {
        //获得Model层返回的列表数据
        void getListData();
    }

}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
大家可能注意到上面的OnHttpCallBack,它是为了给请求数据成功和失败进行回调的接口

public interface OnHttpCallBack<T> {

    void onSuccess(T data);
    void onFail(String error);
}
1.
2.
3.
4.
5.
Model层的代码

public class MainModel implements MainConstract.IMainModel {
    @Override
    public void getListData(final OnHttpCallBack<List<String>> onHttpCallBack) {
       new AsyncTask<Void,Void,List<String>>(){
           @Override
           protected List<String> doInBackground(Void... voids) {
               //模拟请求网络获得数据
               try {
                   Thread.sleep(2000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               List<String> data=new ArrayList<>();
               for (int i = 0; i < 10; i++) {
                   data.add("条目:"+i);
               }
               return data;
           }
           @Override
           protected void onPostExecute(List<String> data) {
               super.onPostExecute(data);
               //成功获取数据回调
               onHttpCallBack.onSuccess(data);
           }
           @Override
           protected void onCancelled(List<String> data) {
               super.onCancelled(data);
               //获取数据失败回调
               onHttpCallBack.onFail("获取数据超时....");
           }
       }.execute();
    }
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
可以看到model层只负责数据的获取和解析成对应的数model,这个和MVC的Model层一致,成为一个独立的单元,其他层不需要关心它是如何实现,达到解耦的目的。

View层代码

public class MainActivity extends AppCompatActivity implements MainConstract.IMainView {

    ListView listView;
    SwipeRefreshLayout swipeRefreshLayout;
    private List<String> mData=new ArrayList<>();
    private MainPresenter mainPresenter;
    private ListAdapter listAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.listview);
        //初始化Presenter层
        mainPresenter = new MainPresenter(this);
        listAdapter = new ListAdapter(this,mData);
        listView.setAdapter(listAdapter);
        //初始化填充数据
        mainPresenter.getListData();
    }
    @Override
    public void refreshData(List<String> data) {
        listAdapter.updateData(data);
    }
    @Override
    public void showRefreshError() {
        Toast.makeText(this,"数据获取失败!",Toast.LENGTH_LONG).show();
    }
}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
可以看到Activity彻底的成为View层,只负责UI的显示、隐藏、数据的填充,实际上到底在什么时候显示隐藏填充数据,View层完全不需要考虑,只需要提供接口给Presenter层调用,把所有的业务逻辑交给Presenter层处理。

Presenter层代码

public class MainPresenter implements MainConstract.IMainPresenter {

    private MainModel mainModel;
    private MainConstract.IMainView mainView;

    public  MainPresenter(MainConstract.IMainView mainView){
        this.mainView=mainView;
        mainModel = new MainModel();
    }
    @Override
    public void getListData() {
        mainModel.getListData(new OnHttpCallBack<List<String>>() {
            @Override
            public void onSuccess(List<String> data) {
                //数据获取成功后刷新adapter
                mainView.refreshData(data);
            }
            @Override
            public void onFail(String error) {
                //数据获取失败,提示语
                mainView.showRefreshError();
            }
        });
    }
}
-----------------------------------
android开发mvp案例 安卓开发mvp
https://blog.51cto.com/u_14844/7436944

相关文章:

  • GPT-4 与 GPT-4 Turbo有什么区别?
  • 记一次重定向问题(浏览器安全)解决
  • Java基础——Optional
  • Vue框架-路由
  • vuejs路由和组件系统
  • 算法-可完成的最大任务数
  • Linux防火墙(以iptables为例)
  • 十种常用数据分析模型
  • 万界星空科技定制化MES系统帮助实现数字化生产
  • 自建公式,VBA在Excel中解一元一次方程
  • docker命令总结
  • upload-labs 21关解析
  • 手把手教你写Java项目(1)——流程
  • 什么是深拷贝和浅拷贝?
  • 微服务架构的优势 与 不足
  • JS 中的深拷贝与浅拷贝
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【刷算法】求1+2+3+...+n
  • 【知识碎片】第三方登录弹窗效果
  • CentOS 7 修改主机名
  • Consul Config 使用Git做版本控制的实现
  • Effective Java 笔记(一)
  • Golang-长连接-状态推送
  • Hibernate最全面试题
  • Java 多线程编程之:notify 和 wait 用法
  • java8 Stream Pipelines 浅析
  • mysql 5.6 原生Online DDL解析
  • MySQL数据库运维之数据恢复
  • 从零开始的无人驾驶 1
  • 飞驰在Mesos的涡轮引擎上
  • 复杂数据处理
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 你不可错过的前端面试题(一)
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 浅谈Golang中select的用法
  • 设计模式(12)迭代器模式(讲解+应用)
  • 实战|智能家居行业移动应用性能分析
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 说说动画卡顿的解决方案
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 【云吞铺子】性能抖动剖析(二)
  • AI算硅基生命吗,为什么?
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • 交换综合实验一
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​力扣解法汇总946-验证栈序列
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $.proxy和$.extend
  • $forceUpdate()函数
  • (2)STM32单片机上位机
  • (31)对象的克隆
  • (35)远程识别(又称无人机识别)(二)
  • (day18) leetcode 204.计数质数