【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程

目录(?)[-]

  1. 主线程消息队列和线程池
  2. 查看线程信息

  

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处: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。

【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程

主线程消息队列和线程池

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(),显示如下:

【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程

相关链接: 我的Android开发相关文章

上一篇:【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图


下一篇:【CodeVS 3290】【NOIP 2013】华容道