热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发之深度项目设计探索(一)

android,开,发之,深度,

如何快速高效构建一款优雅的Android-app架构是大家常聊的话题,本系列文章旨在分析研究探讨基于巨人的肩膀上搭建一款app项目架构。不仅是为了加深对知识点的学习以使用,而且也为了后面的准备。

目前已经有很多开发者贡献了他们的架构轮子,为他们的开源精神点赞。另外,一些优秀的架构涉及到的知识点也值得我们学习和研究(优秀的框架当然可以直接拿来用嘛,这就是开源的灵魂,人人为我,我为人人)

下面是深度项目用到的一些知识点:

项目架构:组件化 + MVP
组件化:

随着APP版本不断迭代,产品不断升级,新功能不断增加,业务会变的越来越复杂,APP业务模块代码也会变的越来越多。长期下去必然会导致APP架构过于冗长杂!试想,Android项目在编译代码的时候电脑会非常卡顿,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,耗时耗力,最重要的是这样的代码想要做单元测试根本无从下手,所以必须有更灵活的架构代替过去单一的工程架构。

基于此组件化方案出现了,给了我们一种新的解决思路:将项目切割成若干个组件,每个组件都是可以独立运行的APP(因为Android Studio声明一个Module 是APP还是Library的主要区别是:apply plugin: 'com.android.application'、apply plugin: 'com.android.library')通过区分以及动态配置,有利于开发人员灵活使用且提高效率(职责细分,提高团队开发意识),当项目完成之时将组件合并在一起,即可组成一个完整的APP,大抵组件化思路就是这样。

另外,组件之间的通信可以使用一些成熟的路由框架。


img_3a0428c2593e6b61036074f18a319d6d.png
组件化方案
MVP:

我想大家最熟悉的就是MVP设计架构了。

MVP,全称:Model-View-Presenter ;MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,
Model提供数据(数据逻辑层,JavaBean模型),View负责显示(一般是指UI界面,如Activity、Fragment等等)。MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。

市面上关于MVP的版本太多,但是其本质都是解耦,实现细节则是通过接口来进行结果的传递。

img_58b6c845fde42322a8b4016286edb3aa.png
MVP架构
依赖注入:Dagger2 + Butterknife
Dagger2:

Dagger2是一款非常优秀的“依赖注入”框架,(拓展:IOC,英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection)。作用:将各层的对象以松耦合的方式组织在一起,解耦,各层对象的调用完全面向接口。)关于具体的原理和逻辑,仁者见仁智者见智。


img_a1fcef717b0f90651ca40a82a0d49f48.png
Dagger2

针对上图提供一个简单的说明:
1)Module 提供依赖,也就是对象(类似经济学里面的供给方)

2)Component 关联依赖,类似于一个容器,中间商(供给方---需求方,两者联系的桥梁),也称连接器

3)Container 使用依赖,(类似于经济学里面的需求方)

Dagger2 重要的注解:

1)@Inject ,在需要依赖(也就是需要具体的对象)时候使用这个注解,

2)@Module ,这个里面的方法专门提供依赖,用此注解的时候,Dagger在构造类的实例的时候就知道去那里找到需要的依赖,

3)@Provide ,这个注解,主要是用来提供依赖,(与@inject互相对应,供给方or需求方一 一对应的关系)

4)@Component ,连接的桥梁,也称为注入器,Dagger源代码里面,此注解需要Module,本质是一个interface,这个接口本身不提供实例对象,由注解@Component 后面的{}里面的.class去提供,

另外,Dagger2也是项目一个深度解耦的有效举措,非常值得一用。

Butterknife:

ButterKnife是一个专注于Android系统的View注入框架,试想我们早期是通过findViewById来找到布局里面的View对象,现在通过ButterKnife可以很轻松的省去这些步骤。通过插件我们可以一键生成寻找viewID、对控件进行点击监听的操作。强大的View绑定和Click事件处理功能,简化代码,提升开发效率 且 代码清晰,可读性强,的确是一款良心之作。作者是我们熟悉的:JakeWharton

另外,ButterKnife是通过注解来完成操作的,并不是在运行时反射的(早期是反射,现在是注解),而是在编译的时候生成新的class来完成具体的操作,运行时不会影响APP效率

项目逻辑

RxJava2:

RxJava2主要提供优雅的响应式Api解决异步请求以及事件处理。其强大的操作符,基于观察者模式的结果传递,简洁精悍的线程调度器,让我们值得学习以及运用在APP上。

RxAndroid:

RxAndroid 为Android提供响应式Api解决方案

Rxlifecycle:

Rxlifecycle本质是为了解决Rxjava2生命周期的问题,通过Rxlifecycle,针对Rxjava2的activity和fragment的生命周期可以得到解决.

RxCache:

RxCache 使用注解为Retrofit加入二级缓存(内存,磁盘)的缓存库.

RxErroHandler

RxErroHandler 是RxJava的错误处理库,可在出现错误后重试.

RxPermissions

RxPermissions 用于处理Android运行时权限的响应式库.

网络框架:Retrofit、OkHttp
Retrofit、OkHttp:

这两款是Android开发经典的网络框架(Retrofit底层是OkHttp)。Retrofit专注封装接口完成业务需求,okhttp专注网络请求的安全高效。内部优秀的拦截器,GZIP压缩,线程池合理使用,让开发者得心应手。

数据解析 Gson
Gson:

Gson是google解析Json的一个开源框架,语法简介且效率高

组件通信 EventBus
EventBus:

能够简化各组件间的通信,让我们的代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。

img_ac071705b3b62b85a827239ec691bd88.png
EventBus
图片框架 Glide
Glide:

Glide是谷歌开源的一款专注于提供流畅划动能力的“图片加载和缓存框架,使用简单

日志框架 Logger
Logger:

Logger是一款让log日志优雅显示的框架,亮点是优雅的输出log信息,并且支持多种格式:线程、Json、Xml、List、Map。

路由框架 ARouter
ARouter:

ARouter是阿里开源的一款路由框架,下面只是列举部分优点:通过URL索引就可以解决类依赖的问题;通过分布式管理页面配置可以解决隐式intent中集中式管理Path的问题;自己实现整个路由过程也可以拥有良好的扩展性,还可以通过AOP的方式解决跳转过程无法控制的问题,与此同时也能够提供非常灵活的降级方式。
另外,ARouter路由解决方案也是实现组件化的重要举措

作为《Android开发之深度项目设计探索》系列的第一篇,主要是技术选型(其中 Rx系列涉及到的知识点很多且是重点),那么接下来的文章就是理论联系实际进行代码实战!

敬请期待!

如果这篇文章对你有帮助,希望各位看官留下宝贵的star,谢谢。

Ps:著作权归作者所有,转载请注明作者, 商业转载请联系作者获得授权,非商业转载请注明出处(开头或结尾请添加转载出处,添加原文url地址),文章请勿滥用,也希望大家尊重笔者的劳动成果。


推荐阅读
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • C#设计模式之八装饰模式(Decorator Pattern)【结构型】
    一、引言今天我们要讲【结构型】设计模式的第三个模式,该模式是【装饰模式】,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 标题: ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • Asp.net Mvc Framework 七 (Filter及其执行顺序) 的应用示例
    本文介绍了在Asp.net Mvc中应用Filter功能进行登录判断、用户权限控制、输出缓存、防盗链、防蜘蛛、本地化设置等操作的示例,并解释了Filter的执行顺序。通过示例代码,详细说明了如何使用Filter来实现这些功能。 ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 注意:以下分析都是基于Retrofit2转载请注明出处:http:blog.csdn.netevan_manarticledetails51320637本节是《Retrofit的使 ... [详细]
author-avatar
sdfsfsd
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有