Why Ice Cream Sandwich Crashes your App

来源:互联网 发布:情趣内衣淘宝 编辑:程序博客网 时间:2024/06/04 01:31

标题
为什么冰淇淋三明治崩溃你的应用程序(冰淇淋指安卓4.x版本)


正文

自冰淇淋三明治的初始版本以来,以下问题一直困扰着StackOverflow:

我的应用程序在运行Android 2.x的设备上运行正常,但在运行Honeycomb(3.x)和Ice Cream
Sandwich(4.x)的设备上强制关闭。为什么会发生这种情况?

这是一个很好的问题 毕竟,较新版本的Android发布,期望旧版应用将与新设备保持兼容。根据我的经验,有几个原因可能会发生。然而,大多数情况下,原因很简单: 您在UI线程上执行潜在的昂贵操作。


什么是UI线程?

应用程序的主UI线程的概念和重要性 是每个Android开发人员应该理解的。每次启动应用程序时,系统将为应用程序创建一个名为“main”的线程。主线程(也称为“UI线程”)负责将调度事件发送到适当的视图/小部件,因此非常重要。这也是您的应用程序与应用程序UI的运行组件交互的线程。例如,如果触摸屏幕上的按钮,UI线程会将触摸事件调度到视图,然后设置其按下的状态,并向事件队列发送无效请求。UI线程将出现此请求,然后通知该视图重新绘制。

这种单线程模型可能会降低性能,除非Android应用程序正确实施。具体来说,如果UI线程负责运行整个应用程序中的所有内容,则在UI线程上执行诸如网络访问或数据库查询等长时间操作会阻止整个用户界面。在长时间的运行过程中,无法发送任何事件(包括绘图和触摸屏事件)。从用户的角度来看,应用程序将会被冻结。

在这些情况下,即时反馈至关重要。研究表明, 0.1秒是关于让用户感到系统瞬间反应的极限。任何比这个限制要慢的事情都可能被认为是滞后的 (Miller 1968; Card et al。,1991)。虽然几分之一秒可能看起来不是有害的,即使是十分之一秒可能是Google Play的一个好的评论和糟糕的评论之间的区别。更糟糕的是,如果UI线程被阻塞超过约五秒钟,用户将会出现臭名昭着的“应用程序无响应”(ANR)对话框,并且该应用程序被强制关闭。


为什么Android会崩溃你的应用程序

您的应用程序在Android 3.0及更高版本上崩溃的原因,但在Android 2.x上工作正常是因为Honeycomb和Ice Cream Sandwich对UI线程的滥用更为严格。例如,当运行HoneyComb或以上的Android设备在UI线程上检测到网络访问时,NetworkOnMainThreadException将会抛出:

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity    ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException

关于为什么发生这种情况的解释在Android开发人员网站上有详细记录:

阿NetworkOnMainThreadException当应用程序试图在其主线程执行联网操作被抛出。这仅针对针对Honeycomb
SDK或更高版本的应用程序。针对早期SDK版本的应用程序可以在其主要事件循环线程上进行网络连接,但是它是非常不鼓励的。

该ICS和蜂窝等操作的一些例子会不会让你的UI线程上执行如下:

  • 打开Socket连接(即new Socket())。
  • HTTP请求(即HTTPClient和HTTPUrlConnection)。
  • 尝试连接到远程MySQL数据库。
  • 下载文件(即Downloader.downloadFile())。

如果您尝试在UI线程上执行任何这些操作,则 必须将它们包装在工作线程中。最简单的方法是使用它AsyncTask,它允许您在用户界面上执行异步工作。An AsyncTask将在工作线程中执行阻塞操作,并将结果发布到UI线程上,而不需要您自己处理线程和/或处理程序。


结论

我决定写这个话题的原因是因为我已经看到它在StackOverflow和其他论坛上无数次出现。大多数时候,错误源于将昂贵的操作直接放置在UI线程上。为确保不会中断用户体验,在单独的线程上执行Socket连接,HTTP请求,文件下载和其他长期操作非常重要。最简单的方法是将操作包装在一个AsyncTask中,它启动一个新线程,并允许您在用户界面上执行异步工作。

和往常一样,让我知道,如果这是有帮助的+ 1 - 发布或留下评论!随时问问题吗?我很快回应。:)


有用的网址

以下是一些有用的链接,可能有助于您开始使用AsyncTasks:

  • AsyncTask 文件
    http://developer.android.com/reference/android/os/AsyncTask.html

  • 性能多线程
    http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html


原文地址
http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html

作者
亚历克斯·洛克伍德
https://google.com/+AlexLockwood

发布日期
2012年06月18日


这里提供梯子
http://blog.csdn.net/qqduxingzhe/article/details/71512508


end


阅读全文
0 0