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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/842199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

芯片设计 | 什么是 NVMe?

文章目录 什么是 NVMe&#xff1f;什么是固态硬盘&#xff1f;为什么 NVMe 很重要&#xff1f;NVMe、SAS 和 SATA 之间的区别只有SSD运行在NVMe上PCIe和NVMe有关系&#xff0c;但它们不是同一个东西NVMe-oF连接SSD到网络NVMe 的工作原理是什么&#xff1f;NVMe SSD 外形尺寸M.2…

零售品牌做好差旅报销管理,真的能省钱

一年一度的“618”如期而至,甚至启动更早了。 各大厂商宣布取消延用了十多年的预售机制,主打“现货开卖”,充分回归“消费者价值”。 零售品牌给消费者省钱,更要给自己省钱。而这前提是充分了解“钱花在哪了”、“怎么花更合理”: ● 商业化BD、促销、营销等市场活动频繁,差…

如何知道huggingface/modelscope的大模型的模型层名字

下载模型后&#xff0c;有个文件叫model.safetensors.index.json&#xff0c;里面有。 你下载的大模型位置在用户名/.cache/huggingface/hub/大模型名差不多这个路径。 或者直接print(parameters.name)&#xff0c;但是这样打出来特别多&#xff0c;很难看。差不多这样写&am…

2024年【山东省安全员C证】考试及山东省安全员C证报名考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【山东省安全员C证】考试及山东省安全员C证报名考试&#xff0c;包含山东省安全员C证考试答案和解析及山东省安全员C证报名考试练习。安全生产模拟考试一点通结合国家山东省安全员C证考试最新大纲及山东省安全员…

VS2022配合Qt与boost.asio实现一个TCP异步通信系统远程操作mysql数据库

上一篇博客我们通过boost.asio搭建了一个简单的异步服务器&#xff0c;但是那是基于命令行的&#xff0c;所有用起来还是相当枯燥的&#xff0c;这次我们配合Qt实现一个简陋的前端页面来控制后端mysql数据库中的表&#xff0c;实现添加密钥的功能(本次博客使用的boost版本是1.8…

数据结构的直接插入排序(C语言版)

一.直接插入排序的基本概念 1.直接插入排序的基本思想 将数组分为已排序和未排序两部分。 每次从未排序部分取出一个元素,将其插入到已排序部分的合适位置,使得已排序部分保持有序。 重复步骤2,直到整个数组有序。 2.排序的工作原理 假设前 i-1 个元素已经有序,现在要将第…

前端开发的设计思路【精炼】(含数据结构设计、组件设计)

数据结构设计 用数据描述所有的内容数据要结构化&#xff0c;易于程序操作(遍历、查找)&#xff0c;比如数组、对象、对象为元素构成的数组&#xff08;每个元素记得设置唯一的 id 属性&#xff0c;以便对元素进行删改操作&#xff09;数据要可扩展&#xff0c;以便增加新的功能…

设置 border 边框单侧样式 - HarmonyOSNext

设置 border 边框单侧样式,通过 api 中查看 border(value: BorderOptions): T; BorderOptions 又包含了若干个子属性 1.width?: EdgeWidths | Length; 2.color?: EdgeColors | ResourceColor; 3.radius?: BorderRadiuses | Length; 4.style?: EdgeStyles | BorderStyle; 其…

MYSQL框架结构

MYSQL框架结构 通过解析器和预处理生成解析树&#xff0c;预处理判断是否合法&#xff0c;如果合法则调用优化器去进行优化。

World Creator v2.1.0 解锁版安装教程 (GPU三维地形生成软件)

前言 World Creator是一款功能相当强大的地形景观生成器&#xff1b;可以完全根据自己的需求来对地形、景观生成您需要三维模型&#xff0c;内置的大量预设&#xff0c;让您的创建拥有无限的可能性。 一、下载地址 下载链接&#xff1a;http://dygod/ITSource 点击搜索&…

蓝卓入选工信部2023年度“揭榜挂帅”项目

蓝卓“面向多元异构和应用快速开发演化的智能工厂操作系统解决方案”&#xff0c;凭借行业领先的平台技术能力以及数智赋能的硬核实力成功揭榜挂帅。 本次入选不仅代表了蓝卓又一次获得工信部权威专家及国家认可&#xff0c;更是“工厂操作系统”首次在国家层面获得表彰。 智能…

【JS】async/await异常捕获,这样做才完美

前言 &#x1f34a;缘由 JS中async/await异步调用&#xff0c;只能通过try-catch吗&#xff1f; &#x1f34d;你想听的故事&#xff1a; 作为一个合格的全栈搬砖工&#xff0c;那必须文武双全&#xff0c;前后必备。遂吾日三省吾身&#xff0c;偶发觉前端长时间不写有些落下…

宝塔Nginx设置图片访问跨域

宝塔Nginx设置图片访问跨域 针对某一个站点设置 找到对应的站点点击 “设置” 增加对应header设置 代码&#xff1a; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${#允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requeste…

【NumPy】关于numpy.subtract()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【全开源】活动报名表单系统(ThinkPHP+Uniapp+uView)

轻松构建高效报名平台 一、引言 随着线上活动的日益增多&#xff0c;一个高效、易用的活动报名表单系统成为了举办各类活动的必备工具。为了满足不同组织和个人的需求&#xff0c;我们推出了功能强大的“活动报名表单系统源码”。本文将为您详细介绍该源码的特点、功能以及使…

【UE数字孪生学习笔记】 使用DataSmith对模型快速导入 UE5.3.2使用unreal DataSmith文件

声明&#xff1a;部分内容来自于b站&#xff0c;慕课&#xff0c;公开课等的课件&#xff0c;仅供学习使用。如有问题&#xff0c;请联系删除。 部分内容来自UE官方文档&#xff0c;博客等 UE5.3.2使用 3D Max 导出的unreal DataSmith文件 1. 去UE官网下载DataSmith导出器并导…

【Linux】中常见的重要指令(下)以及重要的几个热键

目录 一、时间相关的指令date 1.时间戳 二、Cal指令 三、find指令 1.whereis 2.which 四、grep指令 五、zip和unzip指令 六、tar指令 七、bc指令 八、.重要的几个热键[Tab]&#xff0c;[ctrl]-c&#xff0c;[ctrl]-d 一、时间相关的指令date date 指定格式显示时间…

ROM的简单实现

描述 实现一个深度为8&#xff0c;位宽为4bit的ROM&#xff0c;数据初始化为0&#xff0c;2&#xff0c;4&#xff0c;6&#xff0c;8&#xff0c;10&#xff0c;12&#xff0c;14。可以通过输入地址addr&#xff0c;输出相应的数据data。 接口信号图如下&#xff1a; 使用Veri…

Esp32+阿里云物联网平台+DHT11+控制LED(基于PubSubClient库)

Esp32阿里云物联网平台DHT11控制LED 关于本文&#xff1a;利用ESP32连接DHT11温湿度传感器获取温湿度&#xff0c;上报到阿里云物联网平台&#xff0c;通过阿里云物联网平台实时远程查看温湿度&#xff0c;并且接收平台下发的LED灯控制指令。要注意的是&#xff0c;阿里云有两…

【动态规划】零基础解决路径问题(C++)

目录 62.路径问题 解法&#xff08;动态规划&#xff09;&#xff1a; 1. 状态表⽰&#xff1a; 2. 状态转移⽅程&#xff1a; 3. 初始化&#xff1a; 4. 填表顺序&#xff1a; 5. 返回值&#xff1a; 不同路径2.0 解法&#xff08;动态规划&#xff09;&#xff1a; …