【Android 编程架构】MVP实战(附demo)

Github标星5-8K今年最热门技术-Android-MVP-阿里大牛-倾情-详解(上) 2014年年底偶然得知在Android开发中出现了MVP这种模式,当时觉得这东西挺好,正好赶上公司要做一个新的小项目,于是尝试了一下。仿照网上的Demo分出View、Model、Presenter层,抽取View接口,看起来像那么回事的用MVP完成了整个项目。因为项目简单,期间也没有遇到什么坑,但是总觉得还有那些地方不对。 阅读详情

今天有时间,把之前用mvp架构开发的一个需求整理一下。网上大多数是介绍mvp的简单应用,而如何在产品级项目中真正应用mvp架构?

一、mvp架构的优势

到现在为止,我用mvp架构做的需求已经上线了3个大版本,n个小版本了。说实话,刚开始做的时候,并没有意识到mvp对于开发有多大的好处,可是经过这几次版本迭代,mvp架构的优势就凸显出来了——当要加需求时,我只需要改presenter就可以了;当ui有变动,我只需要改fragment里相关的回调里的代码就可以了;当接口契约有改动,我只需要改model层就可以了。层次真的是非常棒!

 

二、mvp是什么?

m是model的缩写,负责数据处理。

v是view的缩写,负责UI视图的渲染。

p是presenter的缩写,负责业务逻辑处理。

它们三者之间的关系是这样的:

翻译成我能理解的话就是,presenter层控制何时渲染UI,同时处理model层的数据回调(实现model回调接口);model层负责请求数据;view层负责UI渲染(presenter层负责何时渲染UI)。

更进一步翻译,mvp架构的基本类结构是什么?

1、View接口

2、View接口的实现类(一般为fragment或activity)

3、model类

4、model回调接口

5、presenter类(实现model回调接口)

所以,如何构建自己的mvp架构?先把这几个必备类结构准备好呀~~

 

三、mvp的具体实现

1、View接口

 

public interface IAroundTravelView {
    //Part 1: result of Search Item
    void initDefaultCopyWriter(String result);
    //Part 2: result of Tab -- aroundGroup, aroundIndependent, flight+hotel, one-day -- Version 2
    void initTabView(List<Icon> list, boolean fromNetwork);
    //Part 3: result of Popular Destinations
    void initPopularDestinationView(List<DestinationInfo> list, boolean fromNetwork);
    //Part 4: result of concrete content of list items of aroundGroup, aroundIndependent, flight+hotel, one-day
    void initTabDetailsView(TabItemTotalInfo tabItemTotalInfo, boolean fromNetwork);
    //Part 5: result of successfully locating
    void locateSuccess(LocationCityResponseModel data);
    //Part 6:result of not successfully locating
    void failed2Locate();
    //Part 7: set text of Location TextView
    void setDepartureCityName(String city);
    //Part 8: start loading when there is no location Cache
    void startLoading();
    //Part 9: stop loading when location response returned
    void stopLoading();
    //Part 10: just loading when requesting http api
    void loadDialog();
    //Part 11: stop the loading dialog when data returned
    void dismissDialog();
    //Part 12: failure
    void setError(int type);
}

由于我这里是直接拿线上代码作为讲解,可能逻辑会复杂一点。在设计之初就应该想到,我的界面里会有哪几种界面渲染情况。比如,主题宫格部分的UI渲染,热门目的地的UI渲染,热门产品的UI渲染等。

 

 

2、View接口的实现类(一般为fragment或activity)

这里就不贴代码了,想怎么画UI,就怎么写fragment好了。

 

3、model类

public class AroundTravelModel {
    private AroundTravelSender sender;
    public AroundTravelModel() {
        sender = new AroundTravelSender();
    }

    public void getSearchData(final OnAroundTravelDataCallbackListener listener) {
        VacationIndexSearchDefaultCopySender vacationIndexSearchDefaultCopySender = VacationIndexSearchDefaultCopySender.getInstance();
        vacationIndexSearchDefaultCopySender.Send(new VacationIndexSearchDefaultCopySender.CallBackObject() {
            @Override
            public void CallbackFunction(boolean success, final Object data) {
                if (success) {
                    listener.requestSearchRes(data);
                } else {
                    LogUtil.e("TAG", "Http 有误...");
                }
            }
        });
    }

    public void getInitData(int saleCityId, int departureCityId, boolean containSaleCity, OnAroundTravelDataCallbackListener listener) {
        sender.send(saleCityId, departureCityId, containSaleCity, listener);
    }

}

里面通常包括几个接口请求。

 

4、model回调接口

public interface OnAroundTravelDataCallbackListener {
    //Part 1: result of Search Item
    void requestSearchRes(Object data);
    //Part 2: failure
    void setError(int type);
    //Part 3:
    void requestInitRes(AroundTravelInfo aroundTravelInfo, boolean containSaleCity, boolean fromNetwork);
}

一般有几个数据请求,这个接口里就有几个方法,再加上请求错误方法。

5、presenter类

这里也不详细介绍了。

 

点击查看demo(传送门)

MVP模式与Android架构设计 作者:禅与计算机程序设计艺术 1.背景介绍 MVP(Model-View-Presenter)模式是Google在2013年推出的Android应用架构模式。它的主要目的是帮助开发者建立健壮、可测试、可维护的应用。通过分离业务逻辑层(Model)和视图层(View)之间的依赖关系,可以使得各层之间更 阅读详情

相关推荐

基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

基于 MVP 架构使用Android通用开发框架快速开发微博项目实战

Android开发MVP模式--项目实战

1 前言 苏宁+App是苏宁易购集团零售云研发中心分销研发中心主要产品之一,由于项目处于初期阶段,业务逻辑复杂,导致业务需求变动快,常常在开发甚至测试过程中出现界面或者后台接口调整的情况。 App客户端如何在外部需求不断变化的情况下,降低模块耦合,尽可能减少每次代码修改量,一方面减少开发人员的工作量,另一方面降低测试工程师的工作量,最终顺利完成项目迭代开发。 2 为什么使用MVP模式 相信在2014年之前,绝大部分人开发Android应用,都是使用的MVC模式,M跟V一般没有什么问题,Controll

Tiger的专栏 790

Android开发实战经典(名师讲坛) 李兴华

Android开发实战经典(名师讲坛) 李兴华 pdf版,入门书籍

Android-MVP模式详解,附超全教程文档_android项目实战—mvp搭建完整项目实战开发 课件

现在新技术层出不穷,如果每次出新的技术,我们都深入的研究的话,很容易分散精力。新的技术可能很久之后我们才会在工作中用得上,当学的新技术无法学以致用,很容易被我们遗忘,到最后真的需要使用的时候,又要从头来过(虽然上手会更快)。我觉得身为技术人,针对新技术应该是持拥抱态度的,入了这一行你就应该知道这是一个活到老学到老的行业,所以面对新技术,不要抵触,拥抱变化就好了。Flutter 明显是一种全新的技术,而对于这个新技术在发布之初,花一个月的时间学习它,成本确实过高。

2301_79098336的博客 1136

基于MVP框架的登录APP实例

一个使用Android Studio编写的一个登录的app,基于MVP框架的简单例子,是个学习MVP框架的好例子

制作 img系统镜像的详细方法

      I.MX6开发板目前支持从TF卡和eMMC启动,启动时,由于各个不同的启动文件对路径有不同的要求,例如uboot文件要求位于启动设备的某个块,dtb文件要求在FAT分区上,文件系统要求在Linux分区上,基于此,我们目前采用将映像制作成img文件的方式,这样可以更简单完成对启动卡的制作。 关于如何制作img,方法如下:方法一  Windows下面利用Win32工具1.   准备我司提供...

armkits的博客 4万+

深入浅出理解Android开发框架中的MVC、MVP和MVVM模式

在Android应用程序的开发过程中,开发者们经常使用一些设计模式和架构,以确保代码的组织性、可维护性和可扩展性。本文将深入介绍三种常见的Android开发框架模式:MVC(Model-View-Controller)、MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel),以帮助您更好地理解这些模式的优势和使用场景。

小北的博客 449

别再折腾端口了!Kali Nethunter Kex 图形化桌面连接失败的真正原因与一键修复(附Termux命令)

本文深入分析了Kali Nethunter Kex图形化桌面连接失败的真正原因,包括端口配置变更、依赖缺失和权限问题,并提供了一键修复方案和Termux命令。通过详细的诊断步骤和优化配置,帮助用户快速恢复Kex功能,提升移动安全测试效率。

weixin_42530732的博客 417

MVC、MVP、MVVM 框架及编程模式的区别

所谓设计模式(Design Pattern),其实是框架结构的呈现,目的是分离应用程序的页面展 示、网络数据交互、数据呈现。随着项目复杂度的不断变化,新的框架也在不断更新迭代,从最早 的MVC模式,到后面的MVP以及MVVM,都是对项目的一种重构。

储存阳光,点亮梦想之路。 440

Qlib上手学习记录

Qlib 是一个面向人工智能的量化投资平台,其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值,从探索投资策略到实现产品化部署。该平台支持多种机器学习建模范式,包括有监督学习、市场动态建模以及强化学习等。真的是走了很多弯路step 1. 使用 ananconda 建立环境,要主要必须是 python 3.8失败的下了以后 进入 glib folder 后执行是会报错的,不管你还什么source 都一样,整了很久使用前最好看下这个。

chenchihwen的专栏 3100

实战指南 | 利用TSMaster的C小程序实时监控DBC报文发送周期

本文提供了一份利用TSMaster的C小程序实时监控DBC报文发送周期的实战指南。通过创建用户变量、编写C小程序核心逻辑并关联图形模块,工程师可以直观地可视化关键报文(如ID 0x64)的发送间隔,从而快速发现周期异常,提升汽车电子开发和测试中总线问题定位的效率与实时性。

weixin_29178069的博客 417

Android MVP-编程思想2(代码实现初级版)

MVP 实战 那么我们下面就要将这个类中的代码改写为 MVP 的写法,回顾上面提及的 MVP 架构的思想,它是将 View 层与 Model 层彻底隔离,意味着 View 和 Model 都不再持对方的引用,它们通过一个第三者 Presenter 来代理事物的传递,所以 Presenter 层会持有 Model 与 View 层的引用,这是第一步。 第二步,是将它们之间的联系抽象出来,以接口的方式...

程序员 400

第一章 EB安装

1.DemoWorkspace 是基于EB当前组件配置下的例程,包含了启动文件和中断服务函数以及组件demo。2.Mclsar 下存放的是EB的插件包和静态MCAL的驱动文件。

舊梦的博客 1963

Android MVP架构学习(附demo)

本篇关于MVP架构的学习是在查阅了很多资料整理出来。网上一些关于Android MVP的介绍都有点浅尝辄止,一个登录或者根据地区查询天气等的小Demo,没有实际在项目中应用的示例,所以在用MVP做完一个小项目之后还是不敢在主项目中轻易尝试。首先,主项目改动起来工作量很大,时间不允许;其次,知道自身对MVP理解还不够,怕掉坑里去;今天主要是想分享一下,本人对MVP的浅见,以及如何使用MVP模式搭建一个项目框架。后续在工作中学习到了有关于MVP模式的见解会继续发表文章。

不积跬步,无以至千里;不积小流,无以成江海。 5755

C# WinForms 多语种切换实现:打造国际化应用程序

合理实现多语种切换功能可以显著提升应用程序的国际化水平。模块化设计:将本地化逻辑模块化,便于管理和维护。异常处理:始终捕获和处理可能的异常,确保程序的健壮性。资源管理:合理管理资源文件,避免重复和遗漏。测试:在不同语言环境下进行全面测试,确保所有字符串都能正确显示。文档和注释:为关键代码添加详细的文档和注释,便于后续维护。

墨夶的博客 1692

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

【项目架构】Android MVP 和MVVM框架模式 学习实例Demo之mvp篇

说在前面 ------------------------------------------------------------------------------------------------------------ 随着移动开发的不断演进,项目开发设计模式也变的越来越新颖,越来越便捷。而各个团队都在追求良好的项目架构,不仅能加快工程的进度,也对后续项目的维护和扩展起来很重要的做用。

梦想启航者 5588

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5956

Android——MVP架构模式之入门demo

什么是MVP?MVP(Model - View - Presenter , 模型 - 视图 - 表示器)模式则是由IBM开发出来的一个针对C++和java的编程模型,大概出现于2000年,是MVC模式的一个变种,主要用来隔离UI、UI逻辑和业务逻辑,数据。 MVP与MVC的区别?MVP——Model-View-presenter 它是MVC模式的变种,UI容易变化的,且是多样的,一样的数据会有N种显

Minor昔年 4244

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

新手也能看得懂的 Android MVP 讲解

前言 作为菜鸟一只,学习的新知识都要记下来,以便日后复习。 本文侧重点在于介绍 Android MVP 的优劣,通过 Google 官方的to-do-mvp 系列项目了解官方是如何使用 MVP 的,并通过自己动手写一个小小的 MVP-demo 来加深对该模式的理解。 不废话了,下面进入正文。 MVC 谈到 MVP,就不能不提它的“前身”- MVC,但为了更好的了解,我们还需要向上追溯...

whdAlive 's blog 2351

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android MVP 详解

Android,Design Pattern,mvp

bolang789的博客 885

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

浅谈Android MVC、MVP、MVVM架构

为什么做架构设计 谈架构之前,我们应该理解,为什么需要做架构设计? 这个问题,单看网上各种架构优缺点分析、什么解耦、方便测试之类的,是很难有深入的理解的,必须要结合实际的项目经验去思考。相信很多小公司的同学会和我有一样的疑问,没有这些所谓的架构,照样代码能写的很嗨,尤其是在项目迭代初期和写一些简单页面时,直接编程反而更加直观更加快速。架构似乎并没有那么牛逼,能够显著提高我们的开发效率。 其实...

u010390677的专栏 328

15个Android开发实战Demo:从基础到进阶的完整学习指南

GitHub 加速计划 / de / Demos 是一个全面的Android开发示例集合,涵盖折线图、Retrofit、RxJava、DataBinding、MVP、MVVM等主流技术,以及自定义控件、NDK开发、蓝牙BLE等实用场景,为开发者提供从入门到进阶的实践参考。 ## 📱 为什么选择这个Demo合集? 对于Android初学者和中级开发者来说,理论学习后最缺乏的就是实战经验。这个项

gitblog_01113的博客 789

探秘MvpDemo:一款实用的Android MVP架构示例项目

探秘MvpDemo:一款实用的Android MVP架构示例项目 在Android开发中,Model-View-Presenter(MVP)架构是一种广泛使用的模式,它有助于提高代码的可测试性和组织性。 是一个由PandaQAQ贡献的开源项目,旨在为开发者提供一个清晰的MVP实现示例,帮助他们理解和应用这一设计模式。 项目简介 MvpDemo是一个小型的Android应用程序,展示了如何在实际项目...

gitblog_00036的博客 520
上一篇: 【计算机基础】base64编码和url编码
下一篇: 【Android 项目构建】Git版本控制实战
Colin_Mindset
博客等级 码龄12年 159粉丝 105原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值