Android的线程安全与UI线程

在前几篇文章中讲到了Android的进程和线程模型,又以此为基础讲述了Android的Handler+Thread模型,然后讲解了Android为此做出的改良Async Task。这里面的问题的核心其实是android的线程机制;那么这篇文章就直接讲述Android的线程安全与UI线程。

文章的目录结构:

1、Android的进程分配

2、Android的单线程模型

3、分析Android的UI线程与工作线程


1、  Android的进程分配




android stop 线程池 android 线程安全_android



查看android的系统结构图我们知道,Android的Runtime中的Dalvik是android中的java虚拟机,是可以支持同时运行多个虚拟机实例的;这样的机制实现了每一个android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。

区别于Linux系统,Android系统为每一个应用程序分配一个独立的用户ID,应用程序在设备上的存续期间,用户的ID保持不变;因为ID不同,并设置了相应的权限,那么不同的应用程序(即对应不同的进程)是不能访问彼此的数据和资源的。

在一般情况下,一个应用对应一个Linux进程,以此保证数据隔离;也同时android提供两个应用程序分配相同Linux用户ID,以让其运行在同一个进程中,共享同一个jvm的能力;这样做只需要两个应用使用相同的应用签名,同时在android的配置文件manifest文件中给他们分配相同的Linux用户ID就可以了(通过android:sharedUserId属性来设置)。


2、Android的单线程模型

了解了Android的进程分配,我们知道了每一个应用会得到一个Dalvik虚拟机,一个进程。在一个应用开始运行的时候(得到虚拟机,进程的时候)Android会同时启动一个对应的主线程(Main Thread),这个主线程我们通常叫它UI线程。因为它的主要工作与UI相关,如:

1)  屏幕绘图(UI更新)

2)  响应用户按键和触摸屏响应

由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序。

如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信。

其实本质来说,就是要UI线程一直保持空闲,一边随时响应工作线程完成触摸事件给予反馈的时候自己及时更新UI,及时响应触摸事件,所以将大部分要做的工作交给工作线程,而UI线程直接面对用户。这里需要做到的就只是:

1)不要阻塞UI线程

2)不要在UI线程之外访问Android UI ToolKit(主要是这两个包中的组件:android.widget 和 android.view)


3、分析Android的UI线程与工作线程

与UI线程对应的其他线程都可以直接称之为工作线程了.在其他的线程中操作UI更新可以有这样的方法:

  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable, long)



4、总结:

解析了android的进程分配,到应用程序在自己的Dalvik虚拟机中运行,得到进程资源,再运行UI线程(响应用户时间和屏幕绘图),然后再开启工作线程执行具体任务最后反馈给UI线程执行UI更新等。这一套流程就走完了;至此android的进程和线程的分析结束。