[译]不要在UI主线程中进行耗时的操作

原文: Why Ice Cream Sandwich Crashes your App

问题

自Android Ice Cream Sandwich发布后, 这个问题就开始在StackOverflow弥散开来:

我的应用在Android2.x上运行良好,但是在3.x 和4.x系统上总是强退,是什么导致的?

这是一个很棒的问题,毕竟开发者总是希望基于旧版本系统开发的应用在新版本的Android系统仍能兼容。在我看来,问题的原因可能多种多样。 但大多数时候,原因非常简单:你把一个可能非常耗时的操作放进了UI线程。

什么是UI线程?

应用的主UI线程的概念及其重要性是每个Android开发者都应理解。当一个应用启动,系统会为应用创建一个名为“main”的主线程。这个主线程(也就是UI主线程)主要负责把事件分发给合适的view或者widget, 因此它非常重要。它也是你的应用和应用的UI交互的线程。例如,如果你点击了屏幕上的一个按钮,UI线程会把点击时间交给view处理,view接到事件后会设置它的pressed状态,然后向事件队列中发送一个invalidate请求。 UI线程会依次读取队列并且告诉view去重绘自己。

除非你的Android应用实现的非常合理,否则这个单线程模型会使性能变得极低。在极端情况下,如果UI线程负责整个应用中的所有操作,进行耗时的操作比如发送网络请求,或者数据库查询等都会导致用户界面的阻塞。这些操作在未完成之前,所有的时间包括绘制和触屏事件都不会被派发。从用户的角度来看,程序似乎是卡死了。

在这些情况下,即时的反馈相当重要。研究表明0.1s是用户感觉系统是否流畅的临界值。任何比临界值更慢的都被认为延迟(Miller 1968; Card et al. 1991)。虽然1秒看起来没什么影响,但在GooglePlay中,即便是十分之一秒也可能是好评和差评的区别。更糟糕的是,如果UI线程被阻塞5秒以上,用户会收到“程序未响应”(ANR)的提示对话框,并且会强制退出。

为什么Android会使应用崩溃

应用在2.x系统运行良好,在3.0及以上平台上崩溃的主要原因在于,3.0以上平台在处理UI线程资源滥用上更加严格。比如说,3.0平台检测到UI线程中有网络请求时,会抛出NetworkOnMainThreadExceptionwill的异常:

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

Android developer网站文档中也对此进行了很好的解释:

当应用试图在主线程中进行网络操作,NetworkOnMainThreadException会被抛出。只有在运行Honeycomb SDK及更高的版本中会被抛出。更早版本的SDK允许在主事件循环线程中进行网络操作,但是非常非常不鼓励这么做。

列出一些ICS和Honeycomb不允许在UI线程中进行的操作:

  • 打开套接字连接 (i.e. new Socket()).
  • HTTP 请求 (i.e. HTTPClient and HTTPUrlConnection).
  • 试图连接远程的 MYSQL 数据库.
  • 下载文件 (i.e.Downloader.downloadFile()).

如果你要在UI线程中进行某些操作,一定要把它们打包到一个工作线程中。其中最简单的方式是使用AsyncTask, 它允许你在你的用户界面中进行一些异步的操作。AsyncTask会把阻塞操作放到工作线程中,并把结果返回到UI线程,而你不需要处理任何与线程相关的工作。

结论

我决定写这篇主题的念头来源于我在StackOerflow和其它论坛上无数次看到了这个问题。问题的主要来源是在UI线程进行了耗时的操作。为了确保用户界面保持流畅,有必要把执行套接字连接、HTTP请求、文件下载和其他的耗时操作放到一个单独的线程中。最简单的方法就是把操作打包到AsyncTask中,它会帮助你启动新的线程并让他们与你的用户界面异步交互。

有帮助的链接

这些资料可能会帮助你熟悉AsyncTask

AsyncTask documentation
Multithreading For Performance

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/459972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机桌面备份在哪里,电脑备份文件在哪里

电脑是我们经常使用的工具,为了放在电脑出现系统问题,有的朋友会将电脑系统备份,但是不知道电脑备份文件放在什么地方了,电脑备份文件在哪里呢?很多朋友还是不知道的,所以针对电脑备份文件保存在哪里的问题…

如何用python打印田字格_如何用 3D 打印一双顶级跑鞋回形针

马拉松赛场上的跑鞋五光十色,除了美观之外,它们还有一个重要作用:保护运动员不受伤害。跑步时,从脚碰到地面开始会受到地面的反作用力。从着陆的减速到随着脚步推蹬过程的加速,这一过程中脚和地面的压力会达到两个峰值…

VS Code 0.5添加ES6支持和Git工具改进

微软多平台Visual Studio 工具VS Code在7月的这次更新中提供了惠及好几种语言的开发者的多项更新。对ECMAScript6 (ES6)的支持就是其亮点之一,另外,所有用户还会发现另一些很有用处的改进——尤其是使用Git或者工程中有大量文件的用户。\\2个新的命令行选…

河北软件职业技术学院计算机专业分数线,河北软件职业技术学院历年分数线 2021河北软件职业技术学院录取分数线...

一、2019年河北软件职业技术学院各省录取分数线及录取位次统计表1、河北软件职业技术学院2019年在山东录取分数线如下:文科录取批次高职专科275分,最低录取位次为208607名、理科录取批次高职专科333分,最低录取位次为274752名;2、河北软件职业…

什么可以作为gcroot_面包果既能当水果又可以作为粮食,国内却无法普及,这是为什么?...

水果是我们大多数人日常都会吃的一种食物,现在国内的水果种类也是非常多,不管是国内本有的还是从国外进口的。但是你吃过面包果吗?可千万不要把它和非洲大陆上的面包树混为一谈,面包果和它半毛钱关系没有,它的原产地在…

Scrum meeting报告

Scrum Meeting报告 要点: 讨论XueBa系统已有的和待实现的功能短期内的任务分配初步确定小组成员在第一轮迭代开发中任务一、 XueBa系统已有的和待实现的功能 项目完成情况: 用户信息管理:注册(邮箱)、登录、注销(退出当前账号)、信息修改…

cookies的存值问题

2019独角兽企业重金招聘Python工程师标准>>> cookies存值问题,项目中遇到问题初始化时由于cookies中存在冒号导致存到cookies中时取出来被转码了,冒号的转码从cookies中取出来为%A3 ,当然一开始我的设想是保存到cookies换一种保存…

计算机专业联考335分,联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总...

原标题:联考专业分、文化分达到多少能过本科线(附2019年美术高考分数线汇总说明:2019年美术高考录取分数线含美术类各批次文化控制线、专业控制线,美术统考合格线。控制线指的是,您达到了某个批次的控制线,就有资格报考…

FragmentTabHost切换Fragment时避免重复加载UI

使用FragmentTabHost时,Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。 解决办法:在Fragment onCreateView方法中缓存View private View rootView;//缓存Fragment vie…

c++ 一个函数包括多个返回值判断_Python函数的概念和使用

函数为了便于程序的维护和更好的实现模块化,好的程序都会分解为很多函数。可以这么说,对于任何的编程语言,函数都是一个非常重要的概念。python 不仅简化了函数的定义过程,而且还大量借鉴了其他函数编程语言中的优秀特性。本章内容…

MySQL数据库引擎介绍、区别、创建和性能测试的深入分析

深入理解MySQL的数据库引擎的类型 作者: 字体:[增加 减小] 类型:转载本篇文章是对MySQL的数据库引擎的类型进行了详细的分析介绍,需要的朋友参考下你能用的数据库引擎取决于mysql在安装的时候是如何被编译的。要添加一个新的引擎&…

微型计算机中JNZ,微机原理jnz是什么指令_微机原理内存分配图

微机原理 数据传送指令微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理指令 微机原理sub指令 csdn微机原理 4指令系统 3通过数据传输地址 地址传送指令 标志传送指令微机原理 4指令系…

vim的安装和配置

vim的安装和配置 使用Linux时,有很多编辑器可供选择,况且vim也不是那么地友好,为什么仍要使用vim呢?鸟哥的解释是: 一、安装vim:sudo apt-get install vim 二、配置vim 在用戶主目录下【~/】建一…

分段处理_连续油管无限级可开关固井滑套分段压裂工艺

连续油管无限级可开关固井滑套分压工艺具有无需射孔、处理级数不受限制、施工效率高等特点,同时可为后期水平井控水及重复压裂提供井筒条件。作业前滑套与套管管柱一趟下入井内,正常进行固井后,依靠固井水泥实现压裂层间封隔。通过连续油管下…

计算机在超声的应用,计算机在医学超声成像中应用.pdf

综 述~计算机在医学超声成像中的应用李义兵1余大昆1刘晓东2(1.咸宁学院生物医学工程系湖北省咸宁市437100;2.襄樊市中心医院湖北省襄樊市441021)摘要介绍了计算机在医学超声成像领域的应用,着重讨论了医学超声图像处理…

常用正则:身份证号码验证正则表达式

需要一个简单的验证身份证号的正则表达式,从网上查了很多,都有问题,主要是只要超过15位,都能够通过,于是自己查了半天手册,写了下面这个式子,能够满足简单的要求:1、15位或18位&…

C语言指针学习(续)

五、数组和指针的关系 int array[10] {0,1,2,3,4,5,6,7,8,9},value; ... ... value array[0];//也可以写成 value *array;value array[3];//也可以写成 value *(array3);value array[4];//也可以写成 value *(array4);上例中,一般而言,数组名arra…

access 根据id删除数据_小程序云开发之数据库自动备份丨云开发101

钻石有价,数据无价。我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失。小程序云开发提供了方便的云数据库供我们直接使用,云开发使用了腾讯云提供…

国家职业资格计算机调试维修技师试题,电工国家职业资格三级(高级)理论试题...

电工国家职业资格三级理论试题一、单选题(第1题~第60题。选择一个正确的答案,将相应的字母填入题内的括号中。每题1.0分,满分60分。)1.异步测速发电机的空心杯转子是用( )材料做成的。(A)低电阻 (B)高电阻 (C)低导磁 (D…

PHP解决方案@时间差异计算函数

为什么80%的码农都做不了架构师?>>> 方案解决目标:计算时间差异 function ago($time){ $periods array("second","minute","hour","day","week","month","year",…