`
yangguangfu
  • 浏览: 1536898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android最佳实践 为响应灵敏性设计

阅读更多

代码可能通过各种性能测试,但是当用户使用时还是会需要漫长的等待,这些就是那种响应不够灵敏的应用——它们反应迟钝,挂起或冻住周期很长,或者要花很长时间来处理输入。
在Android上,系统通过向用户显示一个称为应用无响应(ANR:Application Not Responding)的对话框来防止在一段时间内响应不够快。用户可以选择让应用继续,但是用户并不会想要每次都来处理这个对话框。因此应把你的应用设计得响应灵敏,使得系统不必显示ANR给用户。
通常地,当不能响应用户输入时系统显示一个ANR。例如,如果一个应用在IO操作(经常是网络访问)上阻塞了,那么主应用线程就会无法处理正在进行的用户输入事件。经过一段时间,系统认为应用已经挂起,向用户显示一个ANR,让用户可以选择关闭。
相同地,如果你的应用花太多的时间在构建详细的内存结构上,又或者在计算游戏的下一个动作上,系统会认为你的应用已经挂起。用上面的技术来保证这些计算是高效的一直都是很重要的,但是即使是最高效的代码运行也是需要花费时间的。
在 这两种情况下,解决的办法通常就是创建一个子线程,在这个子线程上做你的大部分工作。这样让你的主线程(驱动用户接口事件循环)保持运行,并让你的代码免 于被系统认为已经冻住。因为这样的线程化通常都是在类级别上来完成的,所以你可以认为响应性能问题是一个类问题(与上面描述的方法级别的性能问题)。
这个文档讨论了Android系统是如何决定一个应用没有响应的,并提供了指引来保障你的应用是响应灵敏的。
1)是什么引发了ANR?
在Android系统上,应用的响应灵敏性由Activity Manager和Window Manager system services所监控,当它监测到如下的其中一个条件时,Android就会为特定的应用显示一个ANR:
5秒内对输入事件无响应。
一个BroadCastReceiver在10秒内没有执行完毕。
怎样避免ANR?
考虑到上面对ANR的定义,让我们来研究一下这是为什么会发生以及怎样最好的组织你的应用以避免ANR。
Android应用正常是运行在一个单独的(如main)线程中的,这就意味着在你应用主线程中正在做的需要花很长时间来完成的事情都能够激活ANR对话框。因为你的应用并没有给自己一个机会来处理输入事件或Intent广播。
因 此任何运行在主线程中的方法应该做尽可能少的事情。特别地Activitiy在关键生命周期方法中如onCreate()和onResume()应当做尽 可能少的设置。潜在地的耗时长的操作(如网络或数据库操作,或高耗费数学计算如改变位图大小)应该在子线程里面完成(或以数据库操作为例,可以通过异步请 求)。尽管如此,这并不是说当等待子线程完成的过程中你的主线程必须被阻塞——你不必调用Thread.wait()或Thread.sleep(),恰 恰相反,你的主线程应该为子线程提供一个Handler,以便子线程完成时可以提交回给主线程。以这种方式来设计你的应用,将会允许你的主线程一直可以响 应输入,以避免由5秒钟的输入事件超时导致的ANR对话。这些做法同样应该被其它任何显示UI的线程所效仿,因为它们属于同样类型的超时。
IntentReciever 执行时间的特定限制限制了它们应该做什么:在后台执行的一些琐碎的工作如保存设置或注册通知。至于其它在主线程里被调用的方法,在 BroadcastReceiver中,应用应该避免潜在的长耗时操作或计算,而是应该用子线程来完成密集任务(因为BroadcastReceiver 的生命周期是短暂的)。对Intent broadcast作出响应,你的应用应该启动一个Service来执行长耗时的动作。同样,你也应该避免从Intent Receiver中启动Activity,因为它会产生一个新的屏,偷走任何用户正在运行的应用的焦点。对Intent broadcast作出的响应,假如你的应用需要向用户显示什么东西,应该用Notification Manager来完成。

增强响应灵敏性
通常,在一个应用中,100到200微秒是一个让用户感觉到阻滞的阈值,因此这里有些小技巧让你用来使你的应用看起来响应更灵敏。
如果你的应用正在后台对用户输入作出响应,显示正在进行的进度(ProgressBar和ProgressDialog对此很有用)。
特别是对于游戏,在子线程中做移动的计算。
如果你的应用有一个耗时的初始化过程,考虑用闪屏或尽可能快地渲染主界面并异步地填充信息。在这两种情况下你都应该表明进度正在进行,以免用户觉得你的应用被冻住了。

1
0
分享到:
评论

相关推荐

    Android最佳实践之响应灵敏性

    Android最佳实践之响应灵敏性 Android 应用程序的响应性是指应用程序对用户输入的响应速度和敏捷性。响应灵敏性是 Android 应用程序的重要性能指标之一,当应用程序的响应灵敏性不够时,会引发 ANR(Application ...

    Android开发技巧与性能优化

    4.2 为响应灵敏性设计 4.3 为无缝设计: 5. 多资源文件的引用 6. ANDROID 调试 LOGCAT 技巧 7. 用 ANDROID 运行最简单的C 程序 8. 开发技巧杂集 8.1 一些源于 CSS 的组合实现技巧 8.2 关于 SEARCH 搜索框的使用 . ....

    Android开发深入浅出

    通过《Android开发深入浅出》,读者不仅可以掌握Android开发的基本技能,还能了解到最新的开发实践和最佳实践,从而提升自己的专业素养,成为一名出色的Android开发者。这本书不仅是初学者的良师,也是资深开发者...

    android eclipse代码

    在Android开发领域,Eclipse是一款曾经非常流行的集成开发环境(IDE),它被广泛用于编写Android应用程序。本资源提供了一个简单的Android页面开发...通过实践和学习,开发者将逐渐熟悉Android的开发流程和最佳实践。

    Android与JAVA编程代码

    在Android与Java编程的世界里,开发者们通过编写代码来实现丰富的功能,打造各种各样的应用程序。Android是由Google主导...同时,不断关注Android的新特性和最佳实践,保持与时俱进,也是成为优秀开发者的重要步骤。

    android.intent.action.TIME_TICK

    在Android系统中,广播接收器(Broadcast Receiver)是一种重要的组件,它允许应用程序对全局系统事件做出响应。...在实际开发中,开发者应谨慎处理这些广播,遵循最佳实践,以提高应用的稳定性和用户体验。

    GestureRecognise_android_

    10. **最佳实践**:避免过度依赖手势,因为它们可能与其他系统或应用的手势冲突。同时,为用户提供明确的指示,让他们知道哪些手势可用以及如何使用。 总的来说,"GestureRecognise_android_"项目涵盖了Android手势...

    安卓开发手册

    最后,手册还涵盖了一些Android开发最佳实践,比如性能优化、支持多屏幕、UI设计的最佳实践、以及如何实现应用的响应灵敏性和流畅性设计。 整套手册旨在通过系统的、循序渐进的学习,帮助初学者掌握Android开发的...

    仿qq侧拉菜单

    总之,"仿qq侧拉菜单"是一个专注于提供高质量用户体验的Android开发实践,它集成了许多Android UI设计的最佳实践,对于学习和提升Android应用的交互设计能力大有裨益。通过研究这个项目,开发者不仅可以了解如何实现...

    Android计步器

    综上所述,创建一个Android计步器应用涉及了传感器数据的获取与处理、用户界面设计、数据存储、权限管理、性能优化等多个方面,而提供灵敏度设置更是提升了应用的个性化和实用性。通过学习和实践这些知识点,开发者...

    强大的顶部导航栏

    在IT行业中,设计一个强大的顶部导航栏是提升用户体验的关键步骤之一。顶部导航栏,也称为头部导航或全局导航,通常位于...开发这样一个组件涉及到Android开发的相关技术和最佳实践,是构建优秀用户体验的重要一环。

    安卓侧拉菜单

    在描述中提到的"很多大神推荐",这可能是指该源码实现了一些最佳实践或者优化,使得侧拉菜单在用户体验、性能和可定制性方面都有出色表现。例如,源码可能包含了以下特点: 1. **响应式滑动**:良好的侧拉菜单应该...

    通讯录导航

    总之,“通讯录导航”项目涵盖了Android开发中的多个核心知识点,从数据存储、数据访问、UI设计到用户体验优化,是学习和实践Android应用开发的一个宝贵资源。通过深入研究此项目,开发者不仅可以提升Android编程...

    Easy Touch 5 Touchscreen Virtual Controls.zip_EasyTrace_easy

    5. **最佳实践** - 在设计触摸控制时,考虑到不同屏幕尺寸和分辨率,建议使用百分比单位来定义控件大小,确保在不同设备上的一致性。 - 为了避免误触,合理设置触摸检测区域,避免覆盖到其他重要的游戏元素。 - ...

    行业分类-设备装置-带触摸屏的控制器面板性能测试平台.zip

    在进行这些测试时,我们需要利用专业的测试工具和标准,如ISO 9241系列人机工程学标准,以及行业内的最佳实践。此外,还需要建立一套详尽的测试用例和测试报告,以便于问题的发现和改进。 通过这套全面的测试平台,...

    OpenGloveDroid:适用于OpenGlove的Config App的原生Android原型

    在开发过程中,开发者会遵循Android的开发最佳实践,包括使用MVVM(Model-View-ViewModel)架构模式来分离业务逻辑和视图层,使用LiveData和Room库进行数据持久化,以及利用Android Jetpack组件提升开发效率和应用...

    ReactNative的手势镜像_JavaScript_下载.zip

    React Native的核心理念是将Web开发的最佳实践带到移动平台,提供接近原生的性能和用户体验。 2. **JavaScript基础**:作为React Native的编程语言,JavaScript是一种广泛使用的解释型、类C语言,具有动态类型、...

    Kotlin-Pokedex:使用ViewModel,LiveData,Room和Navigation的Pokedex应用

    此外,Kotlin-Pokedex可能还包含了其他的最佳实践,如使用Kotlin的扩展函数和高阶函数来增强代码的可读性和简洁性,以及使用Android Data Binding库来简化视图和数据模型之间的绑定。 总的来说,Kotlin-Pokedex项目...

    C++ GUI Programming with Qt 4.rar

    通过学习《C++ GUI编程与Qt 4》,开发者可以掌握Qt框架的精髓,提高GUI开发技能,同时也能了解C++在实际项目中的最佳实践。这本书对于想要从事桌面应用、移动应用或者嵌入式系统开发的程序员来说,是一份宝贵的资源...

    gt911触摸屏驱动程序

    GT911驱动程序应遵循最佳实践,避免内存泄漏,处理好异常情况,确保在硬件故障时能优雅地恢复。此外,定期更新驱动程序以获取厂商的安全补丁和性能提升。 总结,GT911触摸屏驱动程序是连接Linux系统与硬件的关键...

Global site tag (gtag.js) - Google Analytics