【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
2015-12-15 13:52
615 查看
目录(?)[-]
主线程消息队列和线程池
查看线程信息
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
Android的主线程也成为UI线程,为了避免5秒的ANR(应用不响应Application Not Responding),具体见5秒超时异常,这就需要后台线程。每个package在自己进程中运行,在进程中如何组织线程,通常需要handler。
Android进程有四大组件:Activity,Service,ContentProvider(也称为provider)以及BroacaseReceiver(也称为receiver)。这些组件需要在AndroidManifest.xml中给出声明。除了若个例外(例如其他进程调用content provider),这些组件都在主线程运行。对它们的调用,可以是同步的,例如访问content provider,也可以通过一个消息队列延后,例如start service。
同样的,某个进程发出一个broadcast message,如果package进程registered receiver,Android将消息放入该进程的主线程队列中。Service也在主线程运行,如果我们通过startService来触发本地service,也加入到消息队列中。实际上主线程的异步触发是有该消息队列处理。主要注意的是调用本地content provider采用的是同步的方式,而不是异步。
为何这些都在主线程处理,因为主线程要处理UI事件,如果有某个处理的时间有长于5秒的风险,就应该采用线程。另一方面,如果能预估处理的时长,可以采用Handler,延后处理。
当其他进程的客户端或组件调用content provider时,在线程池会分配一个线程来进行处理,外部进程连接service时也同样由线程池分配线程。
Thread t = Thread.currentThread();
long id = t.getId();
String name = t.getName();
long p = t.getPriority();
String groupName = t.getThreadGroup().getName();
Log.v.("Handler","Thread " + name + ": id = " + id + " priority = " + p + " group = " + groupName);
}
我们在MainActivity的主线程中调用logThreadInfo(),显示如下:
相关链接: 我的Android开发相关文章
主线程消息队列和线程池
查看线程信息
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
Android的主线程也成为UI线程,为了避免5秒的ANR(应用不响应Application Not Responding),具体见5秒超时异常,这就需要后台线程。每个package在自己进程中运行,在进程中如何组织线程,通常需要handler。
Android进程有四大组件:Activity,Service,ContentProvider(也称为provider)以及BroacaseReceiver(也称为receiver)。这些组件需要在AndroidManifest.xml中给出声明。除了若个例外(例如其他进程调用content provider),这些组件都在主线程运行。对它们的调用,可以是同步的,例如访问content provider,也可以通过一个消息队列延后,例如start service。
主线程消息队列和线程池
Activity在主线程中运行。主线程负载很大,负责组件的运行,通过一个消息队列来处理。如果我们按button,这个action将转化为message放在队列中,如果放了5秒都没能等到处理,就会抛出ANR异常。同样的,某个进程发出一个broadcast message,如果package进程registered receiver,Android将消息放入该进程的主线程队列中。Service也在主线程运行,如果我们通过startService来触发本地service,也加入到消息队列中。实际上主线程的异步触发是有该消息队列处理。主要注意的是调用本地content provider采用的是同步的方式,而不是异步。
为何这些都在主线程处理,因为主线程要处理UI事件,如果有某个处理的时间有长于5秒的风险,就应该采用线程。另一方面,如果能预估处理的时长,可以采用Handler,延后处理。
当其他进程的客户端或组件调用content provider时,在线程池会分配一个线程来进行处理,外部进程连接service时也同样由线程池分配线程。
查看线程信息
public static void logThreadInfo(){Thread t = Thread.currentThread();
long id = t.getId();
String name = t.getName();
long p = t.getPriority();
String groupName = t.getThreadGroup().getName();
Log.v.("Handler","Thread " + name + ": id = " + id + " priority = " + p + " group = " + groupName);
}
我们在MainActivity的主线程中调用logThreadInfo(),显示如下:
相关链接: 我的Android开发相关文章
相关文章推荐
- 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
- 百度地图 Android SDK - 标注(Marker)的基本使用
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
- 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
- 【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
- 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务
- Android draw、onDraw、dispatchDraw、invalidate、computeScroll 一些简要说明
- 【转】 Pro Android学习笔记(七九):服务(4):远程服务的实现
- 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
- 【转】 Pro Android学习笔记(七七):服务(2):Local Service
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
- Android M中 JNI的入门学习
- android数据缓存
- 【转】 Pro Android学习笔记(六六):安全和权限(3):Provider权限
- android listview 实现从数据库读取已读功能,服务器通知增加,刷新listview
- 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
- 【转】 Pro Android学习笔记(六四):安全和权限(1):签发apk
- 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项