本文概述
- 常见错误1:为iOS开发
- 常见错误2:为Android设备开发
- 常见错误3:不使用意图
- 常见错误4:不使用片段
- 常见错误#5:阻塞主线程
- 常见错误6:重塑方向盘
- 常见错误7:没有成功
- 常见错误#8:不了解位图
- 常见错误9:使用深度视图层次结构
- 常见错误10:未将minSdkVersion设置为14
- 本文总结
安卓这个平台不喜欢什么?它是免费的, 可自定义的, 正在迅速发展, 不仅在你的手机或平板电脑上可用, 而且在你的智能手表, 电视和汽车上也可用。
随着最新的Lollipop更新, Android编程不断改进。自最初的AOSP版本发布以来, 该平台已经相当成熟, 并且将用户期望值设置得很高。看看新的Material Design模式看起来有多好!
有成千上万种不同的设备, 它们具有不同的屏幕尺寸, 芯片架构, 硬件配置和软件版本。不幸的是, 细分是开放性所要付出的代价, 而且, 即使作为高级Android程序员, 你的应用也有数千种方法可能在不同的设备上失败。
无论进行如此大的分段, 实际上都是由于逻辑错误而引入了大多数错误。只要我们掌握正确的基础知识, 就可以轻松地防止这些错误!
这是一个Android编程教程, 用于解决Android开发人员犯的10个最常见的错误。
常见错误1:为iOS开发
令我感到非常高兴的是, 如今这个Android错误已经不那么普遍了(部分原因是客户开始意识到Apple制定所有设计标准的时代已经过去了)。但是, 仍然时不时地, 我们会看到一个iOS克隆的应用程序。
别误会, 我不是Android编程的传播者!我尊重推动移动世界向前发展的每个平台。但是, 在2014年, 用户使用Android已经有一段时间了, 他们已经习惯了该平台。将iOS设计标准推向他们是一个可怕的策略!
除非有很好的理由违反指南, 否则不要这样做。 (Google一直在这样做, 但永远不会通过粘贴粘贴来进行。)
以下是此Android错误的一些最常见示例:
- 你不应该制作静态标签, 它们也不属于底部(我指的是Instagram)。
- 系统通知图标不应具有颜色。
- 应用程序图标不应放置在圆角矩形内(除非这是你的实际徽标, 例如facebook)。
- 启动画面超出了初始设置/介绍的范围。不要在其他情况下使用它们。
- 列表中不应有插入号。
这些只是可能破坏用户体验的许多其他小事情中的一些。
常见错误2:为Android设备开发
除非你为单个平板电脑构建信息亭/促销应用, 否则你的Android应用可能不会在所有设备上都看起来不错。以下是一些要记住的Android编程技巧:
- 与密度无关的像素(dp)与普通像素(px)不同。
- 多次包含资源以说明不同的密度和方向。
- 9补丁可绘制对象被拉伸以适合屏幕。
实际上有成千上万种可能的方案, 但是过了一会儿, 你就会逐渐意识到用少数几种情况来覆盖它们。
你没有数千台设备?没问题Android模拟器在复制物理设备方面非常出色。更好的是, 尝试Genymotion, 它闪电般快速, 并带有许多不同的流行预设设备。
另外, 你是否尝试过旋转设备?所有的地狱都可以挣脱……
常见错误3:不使用意图
意图是Android的关键组成部分之一。这是在应用程序的不同部分之间, 甚至更好的系统上的不同应用程序之间传递数据的一种方式。
假设你有一个图库应用程序, 可以通过SMS共享一些图像的下载链接。这两个选项中的哪个似乎更合乎逻辑?
选项1:
申请SEND_SMS权限。
<uses-permission android:name="android.permission.SEND_SMS" />
编写你自己的代码, 以便使用SmsManager发送SMS。
向你的用户解释为什么你的图库应用程序需要访问可能需要付费的服务, 以及为什么他们必须授予此权限才能使用你的应用程序。
选项2:
启动SMS意图, 让专为SMS设计的应用程序完成工作
Intent sendIntent = new Intent(Intent.ACTION_VIEW);
sendIntent.setData(Uri.parse("sms:" + telephoneNumber));
sendIntent.putExtra("sms_body", x);
startActivity(sendIntent);
如果你有任何疑问, 最好的解决方案是选择2!
这种方法几乎可以应用于任何事物。共享内容, 拍照, 录制视频, 选择联系人, 添加事件, 打开与本机应用程序的链接等。
除非有充分的理由进行自定义实现(例如, 应用滤镜的相机), 否则在这些情况下请始终使用Intent。它将节省你大量的编程时间, 并删除了AndroidManifest.xml不必要的权限。
常见错误4:不使用片段
不久前, 在Honeycomb中, Android引入了片段的概念。将它们视为活动内部存在的具有各自(相当复杂)生命周期的单独构建基块。它们为各种屏幕进行优化提供了很多帮助, 可以通过其父活动轻松进行管理, 可以随意重用, 合并和定位。
为每个应用程序屏幕启动一个单独的活动效率极低, 因为系统会尽力将它们保存在内存中。杀死一个人不会释放其他人使用的资源。
除非你想深入研究Android内核并阅读本文, 以提倡使用片段, 否则应尽可能使用片段。它基本上说片段和游标加载程序具有良好的预期目的, 但实现效果较差。
常见错误5:阻塞主线程
主线程有一个目的:保持用户界面响应。
尽管测量我们的眼睛/大脑可以感知的帧速率的科学很复杂, 并且受许多因素的影响, 但通常的规则是, 低于24 fps且延迟大于100 ms的任何事物都不会被认为是平滑的。
这意味着用户的操作将获得延迟的反馈, 并且你已编程的Android应用将停止响应。剥夺用户对应用程序的控制权会导致沮丧, 沮丧的用户往往会给出非常负面的反馈。
更糟糕的是, 如果主线程阻塞了一段时间(“活动”为5秒, “广播接收器”为10秒), 则会发生ANR。
这在Android 2.x中非常普遍, 以至于在较新版本中, 系统不允许你在主线程中进行网络调用。
为避免阻塞主线程, 请始终将辅助线程/后台线程用于:1.网络调用2.位图加载3.图像处理4.数据库查询5. SD读/写
常见错误6:重塑方向盘
“好的, 我不会使用主线程。我将编写自己的代码, 以便在后台线程中与服务器通信。”
没有!请不要那样做!网络调用, 图像加载, 数据库访问, JSON解析和社交登录是你在应用程序中最常见的操作。不只是你的, 还有每个应用程序。有一个更好的办法。还记得Android如何成熟并成长为一个平台吗?以下是示例的快速列表:
- 使用gradle作为构建系统。
- 使用Retrofit / Volley进行网络通话。
- 使用毕加索进行图像加载。
- 使用Gson / Jackson进行JSON解析。
- 使用常见的实现进行社交登录。
如果你需要实施某些东西, 则很有可能已经对其进行了编写, 测试和广泛使用。在编写自己的代码之前, 请做一些基础研究并阅读一些Android编程教程!
常见错误7:没有成功
大。我们了解到, 有一种更好的方式来处理长时间运行的任务, 并且为此目的, 我们正在使用记录良好的库。但是用户仍然必须等待。这是不可避免的。包裹不会立即发送, 处理和接收。往返延迟, 网络故障, 软件包丢失以及梦想被破坏。
但这一切都是可以衡量的。成功的网络呼叫比不成功的网络呼叫更有可能。那么, 为什么要在处理成功的请求之前等待服务器响应?承担成功和应对失败绝对是更好的选择。因此, 当用户喜欢一个帖子时, 喜欢计数立即增加, 并且在不太可能发生的呼叫失败的情况下, 也会通知该用户。
在这个现代世界中, 期望立即得到反馈。人们不喜欢等待。孩子们不想坐在教室里获得未来不确定的知识。应用必须适应用户的心理。
常见错误#8:不了解位图
用户喜欢内容!尤其是当内容格式正确且看起来不错时。例如, 图像是非常好的内容, 主要是由于它们每个图像传达一千个单词的特性。它们还消耗大量内存。大量的记忆!
在屏幕上显示图像之前, 必须先将其加载到内存中。由于位图是最常用的方法, 因此我们将为整个过程提供Android编程指南:
假设你想在屏幕上显示刚用相机拍摄的图像。为此所需的总内存可使用以下公式计算:memory_needed_in_bytes = 4 * image_width * image_height;
为什么是4?好吧, 最常见/推荐的位图配置是ARGB_8888。这意味着对于我们绘制的每个像素, 我们需要在内存中保留8位(1个字节)用于alpha, 红色, 贪婪和蓝色通道, 以便正确显示它。还有其他选择, 例如RGB_565配置需要的内存是ARGB_8888的一半, 但是却失去了透明度和色彩精度(可能会添加绿色)。
假设你有一台具有全高清屏幕和12 MP摄像头的全新设备。你刚拍摄的图片大为4000×3000像素, 显示该图片所需的总内存为:4字节* 4000 * 3000 = 48 MB
仅用于单个图像的48 MB RAM!好多啊!
现在, 让我们考虑屏幕分辨率。你尝试在具有1920×1080像素的屏幕上显示4000×3000图像, 在最坏的情况下(全屏显示图像), 你分配的内存不应超过4 * 1920 * 1080 = 8.3 MB。
始终遵循Android编程技巧来有效显示位图:
- 测量显示图像的视图。
- 相应地缩放/裁剪大图像。
- 只显示可以显示的内容。
常见错误9:使用深度视图层次结构
布局在Android中具有XML演示文稿。为了绘制内容, 需要解析XML, 需要测量屏幕, 并相应地放置所有元素。这是一个资源和耗时的过程, 需要进行优化。
这就是ListView(以及最近的RecyclerView)的工作方式。
如果布局一次膨胀, 那么系统将重新使用它。但是, 仍然必须在某个时候扩大布局。
假设你要使用图像制作3×3网格。一种实现方法是垂直的LinearLayout包含3个权重相等的LinearLayout, 每个线性布局包含3个权重相等的ImageView。
我们用这种方法能得到什么?警告”嵌套重量不利于性能”。
在Android编程世界中, 有一句话是我刚刚写的:”只需花费很少的精力, 所有层次结构都可以被压平”。
在这种情况下, RelativeLayout或GridLayout将有效地替换嵌套的LinearLayouts。
常见错误10:未将minSdkVersion设置为14
好吧, 这不是一个错误, 但是这是错误的做法。
Android 2.x是开发该平台的一个巨大里程碑, 但是应该留一些东西。支持较旧的设备会增加代码维护的复杂性, 并限制开发过程。
数字很清楚, 用户已经继续前进, 开发人员不应该落后。
我知道这不适用于某些使用旧设备的大市场(例如印度), 并且在Facebook App上将minSdkVersion设置为14, 意味着使数百万用户无法使用自己喜欢的社交网络。但是, 如果你是全新的尝试并试图为用户创造美好的体验, 请考虑消除过去。没有资源或感觉需要升级其设备/操作系统的用户将没有动力尝试使用Android应用程序的高级版本并最终在其上花钱。
本文总结
Android是一个功能强大且发展迅速的平台。期望用户跟上步伐可能并不合理, 但这对于Android开发人员而言至关重要。
更重要的是, 知道Android不仅适用于我们的手机或平板电脑。它在我们的手腕, 客厅, 厨房和汽车中。在开始扩展之前, 正确掌握基础知识至关重要。