关于软件加载资源的思考 软件设计
某日,往奥体中心易杰面试回程,在地铁上听到一人在电话。
是一男子,二十五六年纪,听出来是说他们的app要上某android市场,但由于他针对四种屏幕分辨率写了四个版本,即有四个apk文件,而彼market要求同一app只能上传一个apk。项目负责人要他立刻解决,他说合并的话,工作量太大云云。
等他电话完了,我跟他说了下“写成一个版本,自适应屏幕不久行了?”,他说里面的图片都是动态加载的,而且几条数值曲线是用绘图机制生成,如果全部自适应屏幕,则性能极差,根本不能满足要求。
我为他提供了两套解决方案:
其一,将四个版本的图片放到一个apk中,第一次启动时检测屏幕分辨率,并将不同的绘图折点等必要信息存入一个配置文件,启动时进行一次io操作就行。
其二,将一组大图放入apk,程序第一次运行时检测分辨率(or机型),并根据结果利用大图生成小图(编码实现并不困难,有类库可用),并且生成绘图的配置文件。
并且对于两种方案都有相应的容错机制,比如启动时加载资源前先检测资源的存在性于合法性,如果资源不存在或不合法,则应该生成报错信息,并且提供给用户,friendly interface。并且可以从服务器下载损坏/丢失部分资源,然后再运行。
对于以上两种解决方案,其核心思想为兼容性控制,以及模块化、信息隐藏,手法类似于设计模式中的策略模式。
需要知道目前android硬件分化、版本分化太严重,要写出能够在各个版本机型上流畅运行的程序,则需要要求程序设计具备很高的兼容性,在设计的时候要考虑到程序的适用范围,并且如屏幕分辨率,物理按键,GPS模块是否具备等。但是在真正安装好了之后,就应该让它成为机子的定制软件,而不必再体现出差异性,所以很多事情可以在第一次启动时完成,将变化消弥,从而提高性能。
顺便感慨一下,二玉哥的课实在是软院精华所在,如果没有他的课,软件学院可以更名为码农学院了。
最近在连编程内功,发现自己以前写的几乎都是垃圾,一堆可运行的或不可运行的垃圾,惭愧万分,自此,勤练内功!