Android中的UI线程.doc

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Android中的UI线程

Android中的UI线程 前段时间做项目时遇到几个bug,报的错都是: java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. 解决了之后发现自己对线程这块理解还不是很清晰,因此查了下资料,作此小结.理解不对的地方大家提醒下哈. 一,UI线程 当程序第一次启动时,Android会启动一个进程和一个主线程;当内存不足时,Android会停止一些相对不重要的进程.这个重要性也就是进程的优先级.Android的进程分为以下五个优先级: 1,前台进程,也就是用户当前正在使用的进程。只有到系统内存连它们都供不起的时候才会选择性地去杀死他们. 2,可见进程,是一些不包含前台的组件但是会在屏幕上显示的进程.前两个等级都是用户能看到的,真是偶因一回顾,便为人上人啊.不对,应该是程上程. 3,服务进程,也就是service在的进程.这个进程虽然对用户不是直接可见的,但是他们执行了用户非常关注的任务,所以还是很重要的. 4,后台进程.当某些activity被切换到后台后,它们已经不再和用户交互,这时杀掉它们对用户体验影响并不大. 5,空进程.空进程的存在主要是作为缓存,好缩短程序的启动时间. 除此之外,还要注意,服务进程永不会比其服务的进程的优先级低,因此要善用一些service进程来做后台处理.这些和很多系统都很类似,就不多说啦. 程序启动时会启动一个进程,进程里的主线程,主要是负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。 二,UI线程要注意的两个事项 1,所有的ui操作都必须由ui线程来做 Android遵循单线程模型,所有的ui操作都得由ui线程来做.如果违反这条,程序是跑不通的. 2,UI线程不能阻塞超过5秒 这是Android对ui线程的限定.如果超过了,就会出现Process *** is not responding的警示,然后程序就会被拖出去斩了. 从上面两个注意事项可以看出,我们编程时要时刻注意遵守以下两个原则: 1,所有的UI操作都必须在UI线程里执行. 2,对一些操作时间长的操作,如网络相关的操作,要另起线程去做.这些线程被称为worker线程(叫worker的都命苦).执行完后,要通知UI线程,让UI线程去执行和ui相关的操作. 三,worker线程通知UI线程的几个方式 worker线程执行完后,要通知UI线程,Android给我们提供了一下几种方式: 1,View.post(Runnable)和View.postDelayed(Runnable, long) 使用如下代码所示: public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap b = loadImageFromNetwork(); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(b); } }); } }).start(); } 虽然实现了,但代码看上去有点不好看.嗯,有点绕. 2,Handle 在Android中大家都对Handle应该相当熟了,也是用得比较多的一个类了.用这个也可以实现通知UI线程的效果. public final boolean sendMessage(Message msg) public void handleMessage(Message msg) 3,AsyncTask AsyncTask应该是实现UI线程通知方面一个非常好的选择.很多文章都推荐使用AsyncTask,因为其他方式有时实现起来代码看上去不是很好看. AsyncTask的使用步骤: a, 子类化AsyncTask b, 实现下面AsyncTask中定义方法: onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。 doInBackgro

文档评论(0)

skvdnd51 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档