android-mvp模式

news2024/9/22 11:26:33

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.coloradmin.cn/o/1702192.html

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

相关文章

Android - failed to set system property

记录一次疏忽&#xff0c;起因是我需要在自定义的 receiver 中保存 property 方便&#xff0c;方便在三方 app 中使用&#xff0c;结果直接崩溃了&#xff0c;虽然结果保存成功了&#xff0c;但是这种情况也是无法接收的&#xff0c;错误日志如下&#xff1a; M006082 05-25 1…

rust语言初识

程序设计实践课上水一篇ing 来源&#xff1a;rust基础入门-1.初识rust-酷程网 (kucoding.com) rust作为一名新兴语言&#xff0c;与go又有些许不同&#xff0c;因为它的目标是对标系统级开发&#xff0c;也就是C、C这两位在编程界的位置。比如我们最常用的windows系统&#x…

【Qt】数据库(一)SQLITE创建、增删查改

填坑1&#xff1a;如何连续插入 汇总SQlite语句 创建表格&#xff1a;create table <table_name> (f1 type1, f2 type2,…); 增&#xff1a;insert into <table_name> values (value1, value2,…); 改&#xff1a;update <table_name> set <f1value1>,…

聚观早报 | Bot Fit已完成开发;新一代H6将开启预售

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 5月27日消息 Bot Fit已完成开发 新一代H6将开启预售 苹果上架iPhone 14官翻机 谷歌正台积电合作开发芯片 比亚迪…

预防侵权知识丨什么是图形商标?怎么用产品图片进行图形商标查询检索?

图形商标查询检索是跨境电商预防侵权中重要的一环&#xff0c;但是有很多卖家对图形商标不太了解&#xff0c;也不知道怎么进行图形商标的查询检索。所以&#xff0c;我们一起来看下。 一、什么是图形商标 图形商标是商标的一种&#xff0c;指的是由几何图形或其它事物图案构…

idea上传git命令

git init git remote add origin git add . git commit -m "标题" git push -u origin master

linux 安装chrome浏览器

一、下载安装包 下载地址&#xff1a;https://download.csdn.net/download/k0307x1990y/89349171 二、安装流程 [rootlocalhost ~]# rpm -ivh *.rpm [rootlocalhost ~]# yum -y localinstall google-chrome-stable_current_x86_64.rpm [rootlocalhost ~]# 三、修改配置文件…

IT 行业的现状剖析与未来展望:商业与技术的交织

今日&#xff0c;我无意间看到 CSDN 的创作话题&#xff1a;“我眼中的 IT 行业现状与未来趋势”&#xff0c;这引发了我对 IT 行业的深入思考。以下是我的一些个人见解&#xff0c;希望能得到大家的指正和交流&#xff0c;共同进步。 IT 行业的现状与未来趋势&#xff0c;这个…

无人机行业所需企业服务等级证书详解

无人机行业中的民用无人机企业服务等级证书是对企业在无人机服务领域的能力、技术、管理和服务质量等方面的一种全面认可和评定。这种证书的存在&#xff0c;不仅有助于企业了解自身服务能力和水平&#xff0c;提升服务质量&#xff0c;增强市场竞争力&#xff0c;促进规范化管…

Spring 原理详解

1. Bean的作用域 Bean在Spring中表示的是Spring管理的对象&#xff0c;Bean的作用域是只Bean在Spring框架中的某种行为模式。 在Spring中&#xff0c;支持6中作用域&#xff1a; singleton&#xff1a;单例作用域&#xff0c;在整个 Spring IoC 容器中&#xff0c;只创建一个…

Alamofire常见GET/POST等请求方式的使用,响应直接为json

Alamofire 官方仓库地址&#xff1a;https://github.com/Alamofire/Alamofire xcode中安装和使用&#xff1a;swift网络库Alamofire的安装及简单使用&#xff0c;苹果开发必备-CSDN博客 Alamofire是一个基于Swift语言开发的优秀网络请求库。它封装了底层的网络请求工作&…

每日5题Day11 - LeetCode 51 - 55

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;51. N 皇后 - 力扣&#xff08;LeetCode&#xff09; class Solution {public List<List<String>> solveNQueens(int n) {List<List<String>…

WGCLOUD使用下发指令重启安卓设备

wgcloud的下发命令很好使&#xff0c;可以下发很多命令&#xff0c;最好的是可以选择很多主机同时下发命令 这里我想重启下我的安卓设备&#xff0c;只需要下发一个命令&#xff1a; bash reboot 就好啦 如下图

PTA 判断两个矩阵相等

Peter得到两个n行m列矩阵&#xff0c;她想知道两个矩阵是否相等&#xff0c;请你用“Yes”&#xff0c;“No”回答她&#xff08;两个矩阵相等指的是两个矩阵对应元素都相等&#xff09;。 输入格式: 第一行输入整数n和m&#xff0c;表示两个矩阵的行与列&#xff0c;用空格隔…

韬光养晦的超绝项目

发展方向 竞技闯关类 可以加入对战系统积累积分&#xff0c;竞技类的接受程度更高&#xff0c;小孩&#xff08;我和我身边大多数人小时候&#xff09;都喜欢玩王者吃鸡这种经济类游戏&#xff0c;开放世界探索&#xff08;本项目、一梦江湖、逆水寒&#xff09;的受众群体年…

最新dofm飞行棋高阶版,分享情侣版飞行棋高级版和终极版

阿星今天要给大家带来一款甜蜜蜜的小游戏——情侣飞行棋。这不是普通的飞行棋&#xff0c;而是专为情侣设计的&#xff0c;让你们的感情在游戏中升温&#xff0c;擦出更多爱的火花。 准备好了吗&#xff1f;跟着阿星一起&#xff0c;咱们来看看这款软件的魅力所在&#xff01;…

Kuberbetes图形化界面之Kuboard

1.1 Kuboard Kuboard 是一个 Kubernetes 可视化管理平台&#xff0c;它提供了一种简单易用的方式来管理和监控 Kubernetes 集群。通过 Kuboard&#xff0c;用户可以轻松地部署、扩展和管理容器化应用程序&#xff0c;同时它还提供了一些高级功能&#xff0c;比如集群监控、日志…

YOLOv10环境搭建、模型预测和ONNX推理

目录 1、开源代码、模型下载 2、环境配置 3、模型预测 4、onnxruntime测试 1、开源代码、模型下载 代码下载链接&#xff1a;https://github.com/THU-MIG/yolov10 模型下载&#xff1a; YOLOv10-N&#xff1a;https://github.com/THU-MIG/yolov10/releases/download/v1.1/…

Linux系统安装AMH服务器管理面板并实现远程访问管理维护

目录 前言 1. Linux 安装AMH 面板 2. 本地访问AMH 面板 3. Linux安装Cpolar 4. 配置AMH面板公网地址 5. 远程访问AMH面板 6. 固定AMH面板公网地址 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程…

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

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