当前位置: 首页 > 科技观察

AndroidUI线程与非UI线程

时间:2023-03-11 22:43:22 科技观察

UI线程与Android的单线程模型原理当应用程序启动时,系统会创建一个主线程(mainthread)。这个主线程负责向UI组件派发事件(包括绘图事件)。也是在这个主线程中,您的应用程序与AndroidUI组件(来自AndroidUI工具包的组件(来自android.widget和android.view包的组件))进行交互。所以主线程也叫UI线程或者UI线程。系统不会为每个组件创建一个线程。同一个进程中的UI组件会在UI线程中被实例化,对各个组件的系统调用都是从UI线程分发的。因此,响应系统回调的方法(例如响应用户操作的onKeyDown()和各种生命周期回调)始终在UI线程上运行。当应用程序做一些密集的工作时,单线程模型的性能会很差,除非你合理地实现。特别是如果所有的工作都在UI线程上完成,做一些耗时的工作比如访问网络或者查询数据库会阻塞UI线程,导致事件停止派发(包括绘制事件)。对于用户来说,应用程序看起来像是卡住了,或者更糟的是,如果UI线程被阻塞的时间过长(大约超过5秒),用户将看到一个ANR(应用程序未响应)对话框。此外,AndroidUI工具包不是线程安全的,因此您不能从非UI线程操作UI组件。你必须把所有的UI操作都放在UI线程中,所以Android的单线程模型有两个原则:1.不要阻塞UI线程。2、不要在UI线程外访问AndroidUI工具包(主要是这两个包中的组件:android.widget和android.view)。使用Worker线程是基于单线程模型的两个原则。首先,保证应用程序的响应性,不阻塞UI线程,所以当你的操作不是瞬时的,你应该把它们放到一个单独的线程中(称为后台或工作线程)。例如,点击按钮后,下载一张图片并显示在ImageView中:");mImageView.setImageBitmap(b);}}).start();}这段代码使用了一个新的线程来处理网络操作,但它违反了第二个原则:不要从UI线程之外访问AndroidUI工具包。从非UI线程访问UI组件可能会导致未定义和不可预测的行为。为了解决这个问题,Android提供了一些从其他线程访问UI线程的方法:publicvoidonClick(Viewv){newThread(newRunnable(){publicvoidrun(){finalBitmapbitmap=loadImageFromNetwork("http://example.com/image.png");mImageView.post(newRunnable(){publicvoidrun(){mImageView.setImageBitmap(bitmap);}});}}).start();}这样改之后,就是线程安全的了。但是,当操作变得复杂时,这种代码就会变得非常复杂。为了处理非UI线程和UI线程之间更复杂的交互,可以考虑在worker线程中使用一个Handler来处理UI线程中传入的数据。即将到来的消息。你也可以继承这个类AsyncTask。与UI线程的通信只有UI线程中的对象才能操作UI线程中的对象。为了将数据从非UI线程传输到UI线程,可以使用Handler在UI线程中运行。Handler是Android框架中管理线程的部分。Handler对象负责接收消息,然后处理它们。您可以为新线程创建一个Handler,也可以创建一个Handler并将其连接到现有线程。如果将处理程序连接到UI线程,则处理消息的代码将在UI线程上执行。你可以在你创建线程池的类的构造函数中实例化Handler对象,然后将这个对象存储在一个全局变量中。要与UI线程连接,在实例化Handler时应使用Handler(Looper)构造函数。这个构造函数使用了一个Looper对象,它是Android系统中线程管理框架的另一部分。当您使用特定的Looper实例创建Handler时,Handler会在Looper线程中运行。在Handler中,覆盖handleMessage()方法。Android系统会在Handler管理的相应线程收到新消息时调用该方法。特定线程的所有处理程序对象都将接收相同的方法。(这是一种“一对多”关系)。参考官方Training:CommunicatewithUIthread:http://developer.android.com/training/multiple-threads/communicate-ui.htmlGuides:ProcessesandThreadshttp://developer.android.com/guide/components/processes-and-threads.html类参考:http://developer.android.com/reference/android/os/Looper.htmlhttp://developer.android.com/reference/android/os/Handler.htmlhttp://developer.android.com/reference/android/os/HandlerThread.html【移动开发视频课程推荐】iOS实训Objective-C基础视频教程(40集)Cocos2d-x从零开始【5天掌握跨平台游戏开发利器】】(12集)ObjectiveC编程基础(24集)Android技术入门教程(12集)微信开放平台-Android应用接入(4集)Cocos2d-x跨平台游戏开发基础(29集)iOS开发视频教程-iOS网络编程【进阶】(39集)移动应用用户体验设计进阶教程(60集)从零开始学习iOS开发-UI多视图(30集)iOS开发视频教程【基础介绍】