校导网程家兴 | 漫谈Android技术方案的选择
yuyutoo 2025-01-13 18:59 2 浏览 0 评论
安卓的出现也有好多年了,各种开源类库层出不穷,这也得益于安卓本身是一个开源的系统,方便程序猿们进行再次编译,做二次开发,当然也方便其快速地传播。
正因为如此,当开发者在进行技术选择的时候,时常会感到眼花缭乱。比比皆是的参考,然而开源的作者功力往往参差不齐。笔者以自已多年的经验,以及相关资料的参考,现在对各种技术作一个简单的分析与对比,希望对一些人有帮助。
1.图片加载
图片加载(Universal-Image-Loader,Picasso、Fresco和Glide)
Android不同设备单个进程可用内存是不一样的,可以查看/system/build.prop文件:
# This is a high density device with more memory, so larger vm heaps for it.dalvik.vm.heapsize=24m
上面heapsize参数表示单个进程可用的最大内存,但如果存在如下参数:
dalvik.vm.heapgrowthlimit=16m
largeheaplimit参数表示单个进程内存被限定在16m,即程序运行过程中实际只能使用16m内存。
由此可见,安卓手机端每个应用的运行内存是极其有限,而图片从文件加载成Bitmap在内存中并显示出来,这个过程当中开辟的内存是相当巨大的,稍有不慎,就会引发OOM (OutOfMemory),所以成熟的图片加载库是一个应用的基础。
(1)Picasso有如下特性:
自动添加磁盘和内存缓存,支持对图片作一些具体的操作。比如:加载圆角矩形图片、裁剪图片为圆形。
缺点:就是这个库我们只能看到结果,无法关心图片的下载过程。
(2)Universal-ImageLoader
这个库有着对加载网络图片的详细配置。可以根据个人的喜好,进行一些配置等等。并且可以实现图片下载过程的监听。且可以支持图片下载完成后,显示圆形或者圆角矩形的图片。
(3)Fresco
Fresco是Facebook推出的一款用于Android应用中展示图片的强大图片库,它能够从网络、本地存储和本地资源中加载图片。而且,为了节省数据和CPU,它拥有三级缓存。
Fresco 是一个强大的图片加载组件,支持加载Gif图,支持WebP格式,目前为止最为强大,与此同时它的包文件也是最大。
(4)Glide
Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果;另一个是支持远程图片的获取、大小调整和展示,支持Gif 动画。
2.网络数据请求
网络数据请求(okhttp,retrofit,android-async-http,volley)
okhttp是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。
retrofit是在okhttp基础之上做的封装,项目中可以直接来用,与此同时它支持系统默认的httpUrlConnection,它是可以通过RestAdapter.Builder来灵活配置的。okhttp和retrofit由square团队开发。
android-async-http。与volley一样是异步网络库,但volley是封装的httpUrlConnection,它是封装的httpClient,而Android平台不推荐用httpclient了,而且其回调的json数据的解析要在UI线程中执行,故不推荐。
volley是一个简单的异步http库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。
个人认为retrofit是最佳选择,接口RESTful风格,对于http协议GET, POST, PUT, DELETE, 和 HEAD全部支持,而且retrofit和rxjava可以结合使用,可以让多个REST调用组合变得更简单。
3.AsyncTask 与rxjava
AsyncTask是在Android里面默认的处理工具,开发者可以在里面做一些长时间的处理工作,而不会阻塞用户界面。
表面上,这似乎很简单,你定义一些代码在后台线程中运行,然后定义一些代码运行在UI线程中,在后台任务处理完之后,它在UI线程会处理从后台任务传递过来的执行结果。
使用AsyncTask的最大的问题是在细节的处理上,让我们谈谈这个问题。
(1)错误处理
这种简单用法的第一个问题就是:如果出现了错误怎么办?
不幸的是,暂时没有非常好的解决方案。所以很多的开发者最终要继承AsyncTask,然后在doInBackground()中包裹一个try/catch,返回一个,然后根据发生的情况,分发到新定义的例如onSuccess()或者onError(),随着时间的推移,这些结果可能不会保持很好的一致性和可预见性。
(2)Activity和Fragment的生命周期
当AsyncTask正在运行的时候,如果我退出Activity或者是旋转设备的话会发生什么?
嗯,如果你只是发送一些数据,之后就不再关心发送结果,那可能是没有问题的。但是如果你需要根据Task的返回结果更新UI呢?如果你不做一些事情阻止的话,那么当你试图去调用Activity或者是View的话,将会得到空指针异常导致程序崩溃,因为他们现在是不可见或者是null的。
同样,在这个问题上AsyncTask没有做很多工作去帮助你。作为一个开发者,你需要保持一个Task的引用,并且要么当Activity正在被销毁的时候取消Task,要么当你试图在onPostExecute()里面更新UI的时候,确保Activity是在一个可达状态。当你只想明确地做一些工作,并且让项目容易维护的时候,这将会继续提高维护项目的难度。
除此之外rxjava相较AsyncTask ,支持多个复杂请求的组合调用,测试代码更加的干净整洁。
4.MVP与非MVP
(1)Android MVP开发模式的概念
Android的MVP是由MVC优化衍生出来的一种模式,MVP将MVC中的Controller层进行了优化而生成了Presenter。Presenter层和MVC的Controller一样,负责核心逻辑,但不一样的是Presenter通过接口协议进行数据传递,并阻断了View和Model的直接联系,从而使View和Model更加专注于自身业务逻辑。
● View
View通常来说就是由Activity、Fragment实现的,View会包含一个或多个Presenter的引用来满足视图的业务逻辑。View和Presenter的交互是双向的,即View层可以调用Presenter的逻辑方法,Presenter也可以控制View的显示。
● Presenter
Presenter作为Model和View的桥梁,负责从Model拿到数据进行处理并返回给View。但Presenter和其他两层的沟通是通过接口协议进行的,所以每个Presenter中通常会包涵一个或多个接口协议。
● Model
和MVC一样,作为数据仓库只负责对APP数据进行处理。
(2)Android MVP开发模式的优点
● View和Model之间的耦合度降低,使其更关注自身业务逻辑,结构清晰,维护方便;
● 便于单元测试;
● 代码复用率提高。
(3)MVP开发模式的缺点
主要表现在每个View都有Presenter ,类相对比较多,代码复杂度和学习成本高,在某些场景下Presenter的复用会产生接口冗余。
每个系统应当根据自已的业务情况,选择合适的方案,才能更好的适应自已。
作者简介:程家兴,英文名Tonyee,现任校导网Android开发工程师,曾任多家公司技术部组长,熟悉服务端与移动端技术,拥有6年开发经验。
相关推荐
- 如何在HTML中使用JavaScript:从基础到高级的全面指南!
-
“这里是云端源想IT,帮你...
- 推荐9个Github上热门的CSS开源框架
-
大家好,我是Echa。...
- 硬核!知网首篇被引过万的论文讲了啥?作者什么来头?
-
整理|袁小华近日,知网首篇被引量破万的中文论文及其作者备受关注。知网中心网站数据显示,截至2021年7月23日,由华南师范大学教授温忠麟等人发表在《心理学报》2004年05期上的学术论文“中介效应检验...
- 为什么我推荐使用JSX开发Vue3_为什么用vue不用jquery
-
在很长的一段时间中,Vue官方都以简单上手作为其推广的重点。这确实给Vue带来了非常大的用户量,尤其是最追求需求开发效率,往往不那么在意工程代码质量的国内中小企业中,Vue占据的份额极速增长...
-
- 【干货】一文详解html和css,前端开发需要哪些技术?
-
网站开发简介...
-
2025-02-20 18:34 yuyutoo
- 分享几个css实用技巧_cssli
-
本篇将介绍几个css小技巧,目录如下:自定义引用标签的符号重置所有标签样式...
- 如何在浏览器中运行 .NET_怎么用浏览器运行代码
-
概述:...
- 前端-干货分享:更牛逼的CSS管理方法-层(CSS Layers)
-
使用CSS最困难的部分之一是处理CSS的权重值,它可以决定到底哪条规则会最终被应用,尤其是如果你想在Bootstrap这样的框架中覆盖其已有样式,更加显得麻烦。不过随着CSS层的引入,这一...
-
- HTML 基础标签库_html标签基本结构
-
HTML标题HTML标题(Heading)是通过-...
-
2025-02-20 18:34 yuyutoo
- 前端css面试20道常见考题_高级前端css面试题
-
1.请解释一下CSS3的flexbox(弹性盒布局模型),以及适用场景?display:flex;在父元素设置,子元素受弹性盒影响,默认排成一行,如果超出一行,按比例压缩flex:1;子元素设置...
- vue引入外部js文件并使用_vue3 引入外部js
-
要在Vue中引入外部的JavaScript文件,可以使用以下几种方法:1.使用``标签引入外部的JavaScript文件。在Vue的HTML模板中,可以直接使用``标签来引入外部的JavaScrip...
- 网页设计得懂css的规范_html+css网页设计
-
在初级的前端工作人员,刚入职的时候,可能在学习前端技术,写代码不是否那么的规范,而在工作中,命名的规范的尤为重要,它直接与你的代码质量挂钩。网上也受很多,但比较杂乱,在加上每年的命名都会发生一变化。...
- Google在Chrome中引入HTML 5.1标记
-
虽然负责制定Web标准的WorldWideWebConsortium(W3C)尚未宣布HTML5正式推荐规格,而Google已经迁移到了HTML5.1。即将发布的Chrome38将引入H...
- HTML DOM 引用( ) 对象_html中如何引用js
-
引用对象引用对象定义了一个同内联元素的HTML引用。标签定义短的引用。元素经常在引用的内容周围添加引号。HTML文档中的每一个标签,都会创建一个引用对象。...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)