android系统中的多线程(一): 关于在android中启动线程以及线程间的交互
2011-09-01 15:03
429 查看
在android中,一个应用开始运行的时候,系统将创建一个线程名为main,同时也称作UI
thread.同一进程中的所有组件都在main线程中创建,并且接收用户的操作.如果阻塞该线程超过5s将弹出ANR对话框。同时android的UI工具包是非线程安全的。
因而有两点必须注意:
不要阻塞UI
thread
不要在其它线程中操作UI
也因此推导出两个知识块:
对于需要长时间执行的任务需要启动work thread,在android中启动work thread的方法是什么?
在work thread 如何对UI进行更新和设置
[b]Java传统方法 Thread / Runnable 继承Thread实现run[/b]
创建Runnable,实现run,实例作为参数创建Thread
使用Handler进行线程间交互
每一个Handler的实例都与唯一的线程以及该线程的message
queue 相关联。
默认情况下handler与创建它的线程相关联,但是也可以在构造函数中传入Looper实例,以绑定到其它线程。
Handler的作用就是将message或runnable对象发送到与之相关联的message
queue中,并且从queue中获取他们进行处理。
这就起到了将数据在线程中传递的目的,实现了线程间的交互。
对于Handler启动runnable在下面的关于定时和周期性执行中进行详细介绍
关联于main线程的handler,实现了帮助work thread 更新UI的目的,在关于在work thread中对UI进行更新和设置中详细介绍
为了使handler关联于work thread而非main 线程,需要在构造函数时给定Looper实例
Looper用于执行一个线程的message 循环。通过它handler可以关联上相应的thread及其message queue。默认情况下,thread是没有Looper对象的,需要自己在thread中添加该对象,并调用其 prepare() 和 loop()方法。不考虑同步的情况下简单实现一个有Loop的thread:
其中有2点值得注意:
Looper 在调用prepare() 之后才指向当前thread,之前是指向main thread的
handler必须在thread调用start方法(运行run)之后才能获取looper,否则为空,因为prepare需要在run方法中调用
为了方面使用带有Looper的Thread,android实现了HandlerThread
thread.同一进程中的所有组件都在main线程中创建,并且接收用户的操作.如果阻塞该线程超过5s将弹出ANR对话框。同时android的UI工具包是非线程安全的。
因而有两点必须注意:
不要阻塞UI
thread
不要在其它线程中操作UI
也因此推导出两个知识块:
对于需要长时间执行的任务需要启动work thread,在android中启动work thread的方法是什么?
在work thread 如何对UI进行更新和设置
[b]Java传统方法 Thread / Runnable 继承Thread实现run[/b]
创建Runnable,实现run,实例作为参数创建Thread
使用Handler进行线程间交互
每一个Handler的实例都与唯一的线程以及该线程的message
queue 相关联。
默认情况下handler与创建它的线程相关联,但是也可以在构造函数中传入Looper实例,以绑定到其它线程。
Handler的作用就是将message或runnable对象发送到与之相关联的message
queue中,并且从queue中获取他们进行处理。
这就起到了将数据在线程中传递的目的,实现了线程间的交互。
对于Handler启动runnable在下面的关于定时和周期性执行中进行详细介绍
关联于main线程的handler,实现了帮助work thread 更新UI的目的,在关于在work thread中对UI进行更新和设置中详细介绍
为了使handler关联于work thread而非main 线程,需要在构造函数时给定Looper实例
Looper用于执行一个线程的message 循环。通过它handler可以关联上相应的thread及其message queue。默认情况下,thread是没有Looper对象的,需要自己在thread中添加该对象,并调用其 prepare() 和 loop()方法。不考虑同步的情况下简单实现一个有Loop的thread:
class LoopThread extends Thread{ public Looper MyLooper; public LoopThread(String name){ super(name); MyLooper = Looper.myLooper(); Log.w(TAG, "in thread init: loop "+MyLooper.getThread().getName()); //main } public void run(){ Log.w(TAG, "inthread :"+Thread.currentThread().getName()); //main Looper.prepare(); MyLooper = Looper.myLooper(); Log.w(TAG, "inthread run: loop "+MyLooper.getThread().getName()); //name Looper.loop(); } } LoopThread thread1 = new LoopThread("custom2"); thread1.start(); Handler handler = new Handler(thread1.MyLooper);
其中有2点值得注意:
Looper 在调用prepare() 之后才指向当前thread,之前是指向main thread的
handler必须在thread调用start方法(运行run)之后才能获取looper,否则为空,因为prepare需要在run方法中调用
为了方面使用带有Looper的Thread,android实现了HandlerThread
HandlerThread thread = new HandlerThread("custom1"); thread.start();
相关文章推荐
- android系统中的多线程(一): 关于在android中启动线程以及线程间的交互
- android系统中的多线程(一): 关于在android中启动线程以及线程间的交互
- linux 内核启动过程以及挂载android 根文件系统的过程
- Android通信模块(单线程,多线程通信方式,Handler 与UI Thread的交互,Handler接合子线程的使用)
- Android编译过程总结及android中各种img文件的作用以及系统启动过程
- 多线程在Android中的应用以及线程间的通信
- android中各种img文件的作用以及系统启动过程
- Android 多线程之间的通信交互(Ui线程与子线程之间的通信)Handler,Handler.post(Runnable runnable),runUiThread方式
- Android 的 ramdisk.img、system.img、userdata.img 作用说明,以及UBoot 系统启动过程
- Android关于Activity和task以及近期任务栏启动的相关思考
- Android关于线程优化以及性能优化的一些建议
- Android性能优化5 多线程并发的性能问题所幸的是,Android系统为我们提供了Looper、Handler、MessageQueue来帮助实现上面的线程任务模型: Looper: 能够确保线
- linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析
- Android Input系统的启动以及Input场景下的ANR
- 关于Android的查询CPU、流量、内存以及获取一个app的启动activity
- [转载]Android系统的运行机制: 启动流程与层间交互
- Android 基础组件构成系统分层以及底层启动原理
- 兔子--在Android系统中,启动Service的2种方式以及区别
- linux 内核启动过程以及挂载android 根文件系统的过程 ( 转)
- Android多线程系统概述(sundy深入浅出)之进程和线程