校导网程家兴 | 漫谈Android技术方案的选择
yuyutoo 2025-01-13 18:59 1 浏览 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年开发经验。
相关推荐
- 软件测试的每个方向要分别学什么?
-
#软件测试的每个方向要分别学什么?#以下是软件测试不同方向所需学习的主要内容:功能测试:1.测试理论和方法,如测试流程、测试用例设计方法(等价类划分、边界值分析、因果图等)。2.熟悉软件需求文档的...
- Android组件化框架设计与实践
-
在目前移动互联网时代,每个APP就是流量入口,与过去PCWeb浏览器时代不同的是,APP的体验与迭代速度影响着用户的粘性,这同时也对从事移动开发人员提出更高要求,进而移动端框架也层出不穷。...
- 软件测试人员推荐书目
-
1.《Google软件测试之道》2.《持续交付》3.《软件测试的艺术》4.《代码整洁之道:程序员的职业素养》5.《软件测试》6.《测试驱动开发》7.《软件测试经验与教训》8.《探索式软件测试...
- 新版本系统适配:Android 12 中的兼容性变更
-
随着Android12正式版的发布,越来越多的用户将升级至最新版本。Android12带来大量新API和功能更新的同时也带来了平台兼容性的变更,我们建议开发者优先对当前应用进行测试,并...
- 软件测试工具有哪些(软件测试常用的工具都有哪些)
-
一、一个从事软件测试行业十年的老司机列出以下与软件测试相关的工具:1.操作系统:Linux:vmware、xshell、xftp、ssh2.数据库:主流是以下三种数据库,尤其是MySQL以及or...
- 校导网程家兴 | 漫谈Android技术方案的选择
-
安卓的出现也有好多年了,各种开源类库层出不穷,这也得益于安卓本身是一个开源的系统,方便程序猿们进行再次编译,做二次开发,当然也方便其快速地传播。正因为如此,当开发者在进行技术选择的时候,时常会感到眼花...
- Android App 开发技术图谱
-
引言:今天偶然看到StuQ的技术图谱,找了找竟然没有Android开发的.想起之前自己弄了一个,翻出来看看并不过时,整理下发出,大家共同进步.图片比较大,加载较慢,请等待~~Androi...
- 2022年Android面试题及答案收集(不断更新中)
-
前言找工作、招人必备之良品。后期不断完善中……...
- 如何让Android 支持HEIF 图片解码和加载(免费的方法)
-
字节跳动火山引擎ImageX提供了一种能力,可以支持客户端android直接解码HEIF和HEIC图片,经过测试发现,可以免费使用;一、阅前准备HEIF图片格式是什么?高效率图像格式(HighE...
- 为什么说 Gradle 是 Android 进阶绕不去的坎——Gradle 系列(1)
-
请点赞,你的点赞对我意义重大,满足下我的虚荣心。Hi,我是小彭。本文已收录到GitHub·Android-NoteBook中。这里有Android进阶成长知识体系,有志同道合的朋友,欢迎...
- 精准测试二三谈
-
作者介绍:前ThoughtWorks高级质量分析师,现任HSBC测试咨询专家,擅长敏捷测试,测试开发,devops等领域。我们都在使用敏捷开发,敏捷测试,维护着我们的项目,我们写着少量的testca...
- Android 开发工程师自述:2年的开发,我总结了7条经验
-
全文共3547字,预计学习时长11分钟“纸上得来终觉浅,绝知此事要躬行。”“没有调查就没有发言权。”“实践出真知。”古今中外,无数名言警句都告诉我们实际去做一件事的重要性。笔者从最初对安卓开发萌生兴趣...
- OPPO Android 开发技术面总结
-
今天早上参加了深圳OPPO开发工程师的技术面试,总的来说面试过程不是很顺利。面试官并没有问一些很深奥的底层原理,基本都是一些Java基础以及Android四大组件内的基础,但是我自身在开发...
- Android Jetpack 架构浅析
-
作者:heiyulong原文:https://mp.weixin.qq.com/s/V2haCRugRYCGDZrA9iw7bQ前言本次主要讲解的内容:...
- 一篇文章搞懂Android组件化
-
网上组件化的文章很多,我本人学习组建化的过程也借鉴了网上先辈们的文章。但大多数文章都从底层的细枝末节开始讲述,由下而上给人一种这门技术“博大精深”望而生畏的感觉。而我写这篇文章的初衷就是由上而下,希望...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 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)