Android 多线程
北京理工大学计算机学院 金旭亮
Android多线程技术基础
Android进程
默认情况下,同一应用的所有组件运行于同一进程中,然
后,允许同一应用中的不同组件运行于不同的进程,并且
可以为任何进程创建附加的线程。也允许不同应用中的组
件运行于同一个进程中(只要它们共享同一个Linux
User ID和 Certificates )。
Android应用有四种组件 :Activity, Service, Receiver
和Content Provider, 在manifest中可以设置它们的
android:process 属性。application 元素的
android:process 属性则应用于所有的组件。
2013/11/1 金旭亮移动编程Android系列 3
五个级别进程优先级
Android依据一个importance hierarchy决定
应该Kill掉哪个进程。有五种importance
hierarchy :
1. 前台进程
2. 可见进程
3. 服务进程
4. 后台进程
5. 空进程
2013/11/1 金旭亮移动编程Android系列 4
UI 单线程模型
UI操作并不是线程安全的并且这些操作必须在UI
线程中执行。否则,Android就会发出错误讯息
CalledFromWrongThreadException
Demo: VisitUIControl
2013/11/1 金旭亮移动编程Android系列 5
三种推送工作到UI线程的方法
1. Activity对象.runOnUiThread(Runnable)
2. View对象.post(Runnable)
3. View对象.postDelayed(Runnable, long)
请参看VisitUIControler示例代码
2013/11/1 金旭亮移动编程Android系列 6
定时调用
使用Timer对象可以实现定时调用,它关联着一个任务队
列。
需要定时调用的代码需要封装到TimerTask类的run方法
中,使用schedule()或scheduleAtFixedRate()方法将
TimerTask对象追加到Timer对象的任务队列中。
Timer对象使用独立的线程执行定时任务
可以使用Timer对象的purge方法清空任务队列,从而让
以前的未完成的工作任务不再执行。
如果需要取消定时调用操作(不再执行所有的任务),调
用Timer对象的cancel方法。
2013/11/1 金旭亮移动编程Android系列 7
定时调用实例
TimerDemo
2013/11/1 金旭亮移动编程Android系列 8
AsyncTask
AsyncTask
由于跨线程更新UI控件是一个非常常见的编程场景,为了
简化编程,Android专门设计了一个AsyncTask类完成
这个工作。
AsyncTask代表一个异步任务,在使用时需要从此类派生
出一个子类,重写相关的方法,以便将需要异步执行的工
作封装到此类中。
之后,在UI thread中创建AsyncTask的实例(即new一
个你所设计的AsyncTask子类对象),调用
其 AsyncTask.execute方法(也必须在UI thread中调
用)并传给它一个或多个参数。
如果需要中途取消操作,调用AsyncTask对象的cancel
方法。
2013/11/1 金旭亮移动编程Android系列