Xtreme Labs工程师:Android开发常陷入的五大深坑

来源:互联网 发布:淘宝店铺客服设置 编辑:程序博客网 时间:2024/06/08 11:52

http://www.csdn.net/article/2012-11-22/2812110-android-develop-common-mistakes

摘要:Xtreme Labs的工程师Rob Szumlakowski总结了人们在开发Android应用过程中最常犯的5个错误,包括产品设计、兼容性、内存溢出等问题,为了不再让更多开发者掉进这些坑,他给出了一些建议与解决方法。

作为开源系统,Android丰富的版本,对于开发者来说既是福音,也是诅咒。尽管Android与生俱来的开源特性降低了开发门槛,不过这并不意味着对应用质量的要求也随之降低。

开发美观且实用的应用并非易事,开发过30余款应用的Xtreme Labs的工程师Rob Szumlakowski对此深有体会。他对开发Android应用过程中遇到的Bug与错误进行了总结,他分享了其中5条最普遍误区,并提供了一些解决方法。

与iOS应用采用相似设计

许多开发者都希望可以将现存的iOS应用转码为Android应用,而且不对其设计元素进行任何改动,以求同样的操作体验。这其实是一个可怕的误区。Android应用有着区别于其他平台的界面风格和操作体验。即便采用了同样的设计,同一款应用在iOS平台给人带来的感受,与其在Android平台带来的感受可能完全不同。不仅如此,这些披着苹果皮的Android应用基本上都不支持桌面widget、内容展示窗口以及一些Android平台独有的特性。(想想看,Android版的Instagram就是一个典型。)

对于Android应用应该采用什么样式的设计,Google在已经发布的Android应用设计原则(Android Design Guidelines)中做出了详尽阐述。开发者应当仔细阅读,并取其精华。虽然老话讲“规则就是用来打破的”,对其稍加改进就能让你的应用与众不同,但是在打破规则之前必须要清楚规则是什么!

设备兼容性差

开源是把双刃剑,开发门槛降低的同时,也带来Android设备碎片化的现状。Android生态系统里充斥着各式各样的系统版本、屏幕分辨率、CPU和键盘样式。不过好在Google于11月13日对SDK授权协议进行了修改,增加了有助于遏制Android碎片化的新条款。但是,目前开发者仍然要面对Android设备适配的问题。

其实,Android也为开发者提供了许多工具来应对碎片化问题。以下是一些需要注意的问题:

a.在对UI进行布局时,学会利用dp(Density-Independent Pixels即DIP)或layout_weight。DIP会根据布局系统自动调整至合适尺寸,而且不会受到屏幕尺寸和像素密度的影响。当你想将屏幕按照比例分为不同区域显示时,layout_weight会显得非常实用。不过需要注意的是,layout_weight会强制显示程序繁复测量屏幕的显示大小,而且这个过程比较缓慢。

b.使用XML来规划显示布局,它可以设置适合各种屏幕的图片。

c.一些Android手机配置了可从侧面滑出的物理键盘,当键盘滑出来时,手机界面会自动调整为横屏显示。如果你的应用仅支持竖屏显示,那可能会给用户带来不便。

加载大图时内存溢出

如何在Android设备上加载大图而不会出现内存溢出,一直都是一个被多次提及难题。在调试程序的过程中,可能在一台设备上可以正常缩放、旋转的大图,放在另一台Android设备上则完全行不通,这也是Android碎片化带来的问题。

如何解决呢?首先你要确定在图片下载后,不会被引用,你需要让图片尽快退出堆。如果你执意要为RAM开辟一块空间的话,以下是一些建议:

a.将当加载完成后,确保你的可绘制的对象回调为null。

b.不要给活动的内容或可以引用你图片的视图对象添加你的图片引用

c.不要全屏显示图片,尽可能地使用XML-drawable显示较小的图片。

触摸按钮时没有视觉反馈

尽管这个问题极易解决,但是仍然有不少应用掉进这一误区。当用户点击、滑动,或对应用中的按钮进行操作时,应当给予积极的反馈效果。当点击一个按钮后,最起码应该让它变为高亮显示。

在Android平台上,为“点击”和“长按”状态添加视觉反馈并非难事。你需要使用StateListDrawable对象。最简单的方法就是建立一个可绘制的XML文件。(点击查看实例)

UI-Thread请求受阻

你是否碰到过以下情况:在输入时,程序突然停止响应;程序运行中,弹出“应用无法响应”的窗口。这类状况通常是因为UI-Thread长时间受阻。

如果应用使用UI-thread线程连接网络,那么当应用使用蜂巢API时出现NetworkOnMainThreadException异常,这是非常严重的问题。

想要解决此类问题可以使用AsyncTasks和ThreadPoolExecutors。当后台任务完成后,你可以回调或发送信息至UI-Thread的Message Loop来获取最终结果。

(文章编译:翟方庆 责任编辑:张宁)

文章来源:Venturebeat、Developer