android 最新的框架搭建,Android之Mvp模式框架搭建

前言

在做Android开发时,我们通常为了更合理,更高效,优质的开发项目,并不是直接上来就开始开发功能,而是先搭建好自己的一个开发框架,一个好的开发框架,通常会让我们事倍功半,它就好比我们去建造一个房子,如果你的地基打的越深,越牢固,那么就可以建造出很高很大的房子.

在搭建一个框架前,我们先要考虑一下,这个框架要达到一个什么样的效果,主要从下面三点来进行考虑:

降低项目的复杂度

易扩展,易修改,可用性强,可维护性强

职责单一,功能清晰

Mvp模式介绍

优势

分离了视图逻辑和业务逻辑,降低了耦合。

Activity只处理生命周期的任务,代码变得更加简洁。

视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中,提高代码的阅读性。

Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试。

把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存

泄露和OOM。

实际应用

824e59f34c59

框架图

此图是我搭建Mvp模式的一个架构图,V层与M层分离,通过P层来建立联系,V层主要显示UI,M层进行网络请求,数据库等操作,P层作为一个中心管理器,连接M层和V层.

分包

如下图:

824e59f34c59

image.png

base 存放app的基类

common 存放一些常量,接口,公用的东西

contract 连接V层和P层的一个契约包

model M层,数据库,网络请求,服务等业务操作

presenter P层,负责连接V层和M层,中心管理器

ui V层,负责UI的展示

utils 存放工具类

widget 存放自定义的一些组件

步骤介绍

第一步 编写基类BaseActivity,BasePresenter,IBasePresenter,IBaseView

IBasePresenter代码如下:

public interface IBasePresenter {

/**

* 绑定View

* @param mView

*/

void attachView(V view);

}

IBaseView代码如下:

public interface IBaseView {

}

BasePresenter代码如下:

public abstract class BasePresenter implements IBasePresenter {

//数据管理,负责M层的业务逻辑操作

protected DataManager mDataManager;

//V层的引用

protected V mView;

/**

* 初始化DataManager

*/

public BasePresenter(){

//数据库

AppDbHelper appDbHelper = new DbHelper();

//共享参数存储

AppPreferenceHelper appPreferenceHelper = new PreferenceHelper();

//网络请求

AppApiHelper appApiHelper = new ApiHelper();

mDataManager = new DataManager(appDbHelper, appApiHelper, appPreferenceHelper);

}

/**

* 绑定view

* @param view

*/

@Override

public void attachView(V view) {

this.mView = view;

}

}

BaseActivity代码如下:

public abstract class BaseActivity

extends AppCompatActivity implements IBaseView{

//P层的应用

protected P mPresenter;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(getLayoutId());

//初始化mPresenter

initPresenter();

//绑定view

if(mPresenter != null){

mPresenter.attachView(this);

}

//初始化

initView();

}

/**

* 初始化mPresenter

*/

protected abstract void initPresenter();

/**

* 初始化

*/

protected abstract void initView();

/**

* 获取布局id

* @return

*/

protected abstract int getLayoutId();

}

第二步 编写测试类MainActivity(V),MainContract(契约),MainPresenter(P),DataManager(M)

MainActivity代码如下:

public class MainActivity extends BaseActivity implements MainContract.View {

@Override

protected void initPresenter() {

mPresenter = new MainPresenter();

}

@Override

protected void initView() {

mPresenter.testGetMpresenter();

mPresenter.testDb();

mPresenter.testRequestNetwork();

mPresenter.testPreference();

}

@Override

protected int getLayoutId() {

return R.layout.activity_main;

}

@Override

public void testGetMview() {

Log.d("print", "我是V层的引用");

}

}

MainPresenter代码如下:

public class MainPresenter extends BasePresenter implements MainContract.Presenter{

@Override

public void testGetMpresenter() {

Log.d("print", "我是P层的引用");

mView.testGetMview();

}

@Override

public void testDb() {

mDataManager.testDb();

}

@Override

public void testRequestNetwork() {

mDataManager.testRequestNetwork();

}

@Override

public void testPreference() {

mDataManager.testPreference();

}

}

MainContract代码如下:

public interface MainContract {

interface View extends IBaseView{

void testGetMview();

}

interface Presenter extends IBasePresenter{

void testGetMpresenter();

void testDb();

void testRequestNetwork();

void testPreference();

}

}

DataManager代码如下:

public class DataManager implements AppDbHelper,AppApiHelper,AppPreferenceHelper{

private AppDbHelper mAppDbHelper;

private AppApiHelper mAppApiHelper;

private AppPreferenceHelper mAppPreferenceHelper;

public DataManager(AppDbHelper mAppDbHelper, AppApiHelper appApiHelper, AppPreferenceHelper appPreferenceHelper) {

this.mAppDbHelper = mAppDbHelper;

this.mAppApiHelper = appApiHelper;

this.mAppPreferenceHelper = appPreferenceHelper;

}

@Override

public void testDb() {

mAppDbHelper.testDb();

}

@Override

public void testRequestNetwork() {

mAppApiHelper.testRequestNetwork();

}

@Override

public void testPreference() {

mAppPreferenceHelper.testPreference();

}

}

第三步 编写数据库,网络请求等类

AppDbHelper代码如下:

public interface AppDbHelper {

void testDb();

}

DbHelper代码如下:

public class DbHelper implements AppDbHelper{

@Override

public void testDb() {

Log.d("print", "数据库操作");

}

}

AppApiHelper代码如下:

public interface AppApiHelper {

void testRequestNetwork();

}

ApiHelper代码如下:

public class ApiHelper implements AppApiHelper{

@Override

public void testRequestNetwork() {

Log.d("print", "网络请求操作");

}

}

AppPreferenceHelper代码如下:

public interface AppPreferenceHelper {

void testPreference();

}

PreferenceHelper代码如下:

public class PreferenceHelper implements AppPreferenceHelper{

@Override

public void testPreference() {

Log.d("print", "共享参数存储操作");

}

}

运行效果图:

824e59f34c59

效果图

总结

Mvp模式在Android开发中被使用的越来越多,尤其是配合RxJava+Retrofit+Okhttp+Dagger2+Glide等第三方开源库,好处不用多说,所以大家赶紧都用起来吧,最后附上Mvp模式Demo

如果大家对我的文章感兴趣的话,请给我点个赞!!!

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

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

相关文章

curl在android服务器上编译,Android curl的上载编译和使用

mm执行编译:PLATFORM_VERSION_CODENAMERELPLATFORM_VERSION4.0.3TARGET_PRODUCTfullTARGET_BUILD_VARIANTengTARGET_BUILD_TYPEreleaseTARGET_BUILD_APPSTARGET_ARCHarmTARGET_ARCH_VARIANTarmv7-aHOST_ARCHx86HOST_OSlinuxHOST_BUILD_TYPEreleaseBUILD_IDIML74Kmak…

英特尔nuc能代替主机吗_python编程,热度为什么越来越高,python能代替JAVA吗?...

大家好,我是你们的软件主讲老师宁彤天,python编程是这几年刚火起来了,这可能是这几年人工智能的普及吧,现在是人工智能非python,没有第二,当能其它语言也能实现人工智能,但python的代码量能用最…

python 网页自动化框架_python+selenium自动化框架

项目以前的UI自动化大概是这样分层的1.Common功能层:一些经常被调用的基本常用操作,用来完成某项具体的功能,与具体的业务无关。比如常用的封装:--将元素定位方法重新封装--封装上下左右滑动 eg: swipe(directdown,count1)--pinch…

小程序监听android返回键,如何监听小程序返回按钮事件?

写在前面为了能及时的将自己踩到的前端坑(包括ionic,angular,react,ReactNative,小程序,APICloud)分享给大家,以后会逐渐将文章转移到微信公众号:前端e家(front_e_family)。可直接扫码关注,公众号会不定期更新新文章,分享踩坑笔记…

mix2s 升级android p,小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?...

原标题:小米推送小米MIX2S 安卓P稳定版更新 这两个隐藏升级你发现了吗?今天上午,小米推送了小米MIX2S的稳定版更新,版本号为MIUI V10.0.4.0,体积为2GB,这一次更新将系统底层更新至了Android P,不…

如何用python做一个会聊天的女朋友_520来啦~教你用Python给自己造了一个女朋友!...

520这一天,也是网络情人节。就在那天,如果没有女朋友的自己,如何假装自己是有朋友的!如何在朋友圈“秀恩爱。女生版:image很有感觉有木有~~男生版:imageimage其实这些都是小意思啦~~这些都是假装自己有女朋…

鸿蒙系统定位低端市场,明年年初见!鸿蒙系统会先定位中低端,后续全面升级...

惊变20年鸿蒙系统手机会先定位中低端惊变20年上个月的华为H..DC2020开发者大会上,余承东对外公布将在明年开发出搭载鸿蒙系统的手机,并且采用EMUI11的华为手机可以拥有优先享受升级鸿蒙的待遇,手持华为手机的用户都颇为期待。惊变20年根据最新…

jsfor循环终止_js 终止 forEach 循环

wp8 入门到精通 MultiMsgPromptList arraymsg new List(); List ArrayNotifyInfo ...转:Top 10 Algorithms for Coding InterviewThe following are top 10 algorithms related concepts in coding interview. I will try to illustrate t ...Unity游戏开发——自动…

python求出五位数的回文数_python之递归

#codingutf-8#题目:打印出如下图案(菱形)nu 1 # 开始值k 2 # 变量值while nu > 0:print(int((7 - nu) / 2) * * * nu)nu kif nu 7:k -k#题目:有一分数序列:2/1 ,3/2 ,5/3 ,8/5 ,1…

html大小写字符串转换成整数,c++字符串大小写转换

由于ANSI和Unicode在函数名上有差别,故都列出来,不过本人以Unicode为主。【1.用C语言标准库函数toupper,tolower】头文件:cctype c下面:ctype.h转大写Ansi版: int toupper(int c);Unicode版:int towupper(w…

adams建立一绳索不带滑轮_ADAMS绳索仿真

在实际生活中有大量的绳索类传动运动形式。绳索类部件看似简单,但是用计算机软件对其模拟时却存在较大障碍。以钢丝绳为例,通常都是通过细长的钢丝螺旋缠绕在一起形成,在工作时当施加拉力载荷于其上,除了材料自身的拉力作用外&…

html正则判断全数字,javascript如何判断是不是数字?

javascript判断是不是数字的方法:方法一、使用js自带的全局函数isNaN()判断是不是数字。方法二、使用正则表达式判断是不是数字。方法三、通过typeof的返回值判断。JavaScript中判断是不是数字方法详解:第一种方法:isNaN()使用js自带全局函数…

弱加密算法有哪几种_常见的几种加密方法

常见的几种加密方法和实常见的几种加密方法 :MD5SHA1RSAAESDES1、MD5加密 是HASH算法一种、 是生成32位的数字字母混合码。 MD5主要特点是 不可逆MD5算法还具有以下性质:1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。2、…

html怎么无损插入背景音乐,HTML插入背景音乐方法【全】

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Syche我今天本来是做网页玩来着,忽然想在博客上放一个类似QQ空间背景的音乐播放器,于是晚上找了之后,终于实现了这个功能,这里和大家来分享一下:一:TESTsrc&qu…

law是什么的缩写_Lawyer和Attorney 有什么不同?

据美国劳工统计局(Bureau of Labor Statistics)预计,2016年至2026年间,律师的就业增长率为8.2%。在此期间,预计将新增6.5万个就业岗位。而且美国律师行业的,律师行业在US.NEWS 的Best Social Services Jobs中排名第一,…

获取不到html页面上的元素,Vue v-for渲染页面,获取不到DOM元素解析

v-for 渲染循环渲染页面的出现让我们告别了繁琐的JS拼接,在开发上面节省了很多时间。近期在开发中发现了在某些特定情况下,出现了获取不到渲染出来的DOM元素的情况,原因身为小白的我暂时还没搞清楚(忘大佬指出),但是却得出来初步的…

android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2

Android蓝牙4.0 Ble读写数据详解 -2上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑。先介绍一款调试工具,专门调试Ble蓝牙的app。名字叫:nRF-Connect 谷歌应用商店也能下载到。这里我先连接一个蓝牙设备 贴几个截图。UUID的…

选择座位html,影厅座位预览效果(css3)_html/css_WEB-ITnose

查看 demo 下载源码你可能对那些购买时需要选择座位的订票系统比较熟悉。通常在比赛,电影,搏击或者演唱会售票的时候需要这样做。如果能有一种座位的预览效果该有多酷啊,比如能够从你选择的位置的角度去预览舞台或者屏幕。这个问题引出了今天…

html 使用百度搜索,百度搜索uzer,进入主页

windows7的uzer.me怎么 安全上网百度搜索uzer,进入主页下载完成以后,点击,快捷方式,运行。登陆后,首先出现的是文档库,点击文档库。UZER上的软件和文件都打不开,网络没问题。因为安装的软件版本…

php广告任务网源码_THINKPHP仿我爱广告任务网|任务网站源码下载

Thinkphp仿我爱广告任务网网站源码下载,基于PHPMYSQL开发制作的在线广告打码任务网站源码,底层内核为THINKPHP,大体完整!有需要的朋友可下载尝试下!安装环境:php5.3以上 mysql5.6安装方法:1、导入根目录下…