百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

校导网程家兴 | 漫谈Android技术方案的选择

yuyutoo 2025-01-13 18:59 3 浏览 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年开发经验。

相关推荐

建筑福利-pdf转dwg格式转换器,再也不用描图-极客青年

作为一名经常熬夜画图的建筑狗或者cad用户,你体验过pdf图纸描图到cad吗?前几天一个老同学找我,说他的毕业设计需要我帮忙,发给我一份pdf图纸文件,问我怎么把pdf图纸转换成dwg格式。机智的我灵...

想学 HTML,不知从何入手?看完这篇文章你就知道了

很多人都说HTML是一门很简单的语言,看看书,看看视频就能读懂。但是,如果你完全没有接触过,就想通过看一遍教程,背背标签,想要完全了解HTML,真的有点太天真了。HTML中文...

「前端」HTML之结构

今天继续为大家分享前端的知识,如果对前端比较感兴趣的小伙伴,可以关注我,我会更大家继续分享更多与前端相关的内容,当然如果内容中又不当的或者文字错误的,欢迎大家在评论区留言,我会及时修改纠正。1.初识H...

手把手教你使用Python网络爬虫下载一本小说(附源码)

大家好,我是Python进阶者。前言前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。...

用于处理pdf文件格式的转换器

在上传过程中如果单个文件太大则容易中断,而且文件太大的话对与存储也有些弊端。那么我们应该想到将文件进行压缩(注意这里压缩指的是不改变文件格式的压缩,而不是用变成压缩文件。这里就将以下用专门的软件压缩P...

乐书:在线 Kindle 电子书制作和转换工具

之前Kindle伴侣曾推荐过可以在Windows和Mac系统平台上运行的kindle电子书制作软件Sigil(教程),用它可以制作出高质量的的ePub格式电子书,当然最后还需要通...

付费文档怎么下载?教你5种方法,任意下载全网资源

网上查资料的时候,经常遇到需要注册登录或者付费的才能复制或者是下载,遇到这种情况大多数人都会选择重新查。...

捡来的知识!3种方法随便复制网页内容,白嫖真香呀

网上的资源真的多,所以许多人常常会从网上找资料。我们看到感兴趣的内容,第一时间可能会想要收入囊中。比如说截个图啊,或者挑选有意思的句子复制粘贴,记录下来。可是,有些时候,却会遇到这样的情况:1、内容不...

AI的使用,生成HTML网页。

利用deepseek,豆包,kimi以及通义千问,写入相同的需求。【写一个网页,实现抽奖功能,点击“开始”,按键显示“停止”,姓名开始显示在屏幕上,人员包括:“张三”,“里斯”,“Bool”,“流水废...

pdf转换成jpg转换器 4.1 官方正式版

pdf转换成jpg工具软件简介pdf转换成jpg转换器是一款界面简洁,操作方便的pdf转换成jpg转换器。pdf转换成jpg转换器可以将PDF文档转换为JPG,BMP,GIF,PNG,TIF图片文件。...

办公必备的office转换成pdf转换器怎么用?

2016-02-2415:53:37南方报道网评论(我要点评)字体刚从校园走出社会,对于快节奏的办公环境,难免会觉得有些吃力。在起步阶段力求将手头上的事情按时完工不出错,但是渐渐的你会发现,别人只...

为什么PDF转Word大多要收费?

PDF转Word大多都要收费?并非主要是因为技术上的难度,而是基于多方面的商业和版权考虑的,下面给大家浅分析下原因:...

如何用python生成简单的html report报告

前提:用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html表格来显示。需要的组件:jinja2flask...

学用系列|如何搞定word批量替换修改和格式转换?这里一站搞定

想必不少朋友都会碰到批量修改word文档内容、压缩文档图片、文件格式转换等重复性文档处理工作的需要,今天胖胖老师就推荐给大家一个免费工具XCLWinKits,一站搞定你所有的需要。什么是XCLWinK...

这款PDF文档转换神器,能帮你解决PDF使用中的许多难点

不管是平时的学习还是工作,相信许多朋友都经常接触PDF文件。可以说,PDF文件在我们的日常办公学习过程中的重要性和Word文档一样重要。在之前的更新中,小编介绍了几款非常不错的PDF文档格式转换软件,...

取消回复欢迎 发表评论: