非常简单一段代码import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;public class TestHandler extends Activity { private Handler handler=new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
handler.post(theadRunnable);
setContentView(R.layout.main);

System.out.println("Activity ID:"+Thread.currentThread().getId());
System.out.println("Activity NAME:"+Thread.currentThread().getName());
}
private Runnable theadRunnable=new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Handler ID:"+Thread.currentThread().getId());
System.out.println("Handler NAME:"+Thread.currentThread().getName());
try {
Thread.sleep(100000);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
};
}然后,它的输出结果是:
12-22 13:19:29.361: I/System.out(372): Activity ID:1
12-22 13:19:29.410: I/System.out(372): Activity NAME:main
12-22 13:19:29.471: I/System.out(372): Handler ID:1
12-22 13:19:29.471: I/System.out(372): Handler NAME:main
这让我很不理解,输出结果的顺序和我想的完全相反。
希望有朋友能帮我解释这个输出结果是为何

解决方案 »

  1.   

    handler.post(theadRunnable);通俗点说,post方法的功能好比是向消息队列中放入一个任务theadRunnable,任务放进去后,这个方法就返回了,这个任务并不会立马被执行;主线程继续向下
    执行,所以先看到的是main的信息。等main执行完后(这个速度是很快的),再从消息队列中取出
    刚才放的任务,并执行这个任务,也就是run方法,所有后看到的是thread信息。一句话:就是Android中所谓的异步机制。
      

  2.   

    runable和 onCreate都是在主线程中运行的,也就是main。runable又不是一个thread, post过去等会还是在主线程消息轮回中之心的。要新起thread的话,你得创建thread并start它才可以。
      

  3.   

    theadRunnable任务其实也是在主线程中执行的!
      

  4.   

    这里也没啥异步不异异步的那些回调函数, onCreate,onPause, onStop等, 和你runable中的run在主线程中的调用过程差不多。
    post一个消息,是塞到队列的尾部, 消息循环取队列头上的动作去执行。你的handler.post(theadRunnable);
    还要等很久才能排上队执行呢
      

  5.   

    在这里runnable并没有新起一个线程。
      

  6.   

    handler的用法我感觉还是很诡异的。
    请教一个问题,在消息队列里是不是同时可以放置Runnable和Message?那么当队列首位是Runnable,其次是一个message的时候。handler是取出这个Runable去执行,还是会调用handleMessage(Message msg),执行这个方法体?
      

  7.   

    那send一个message,是不是也会被排到队尾,等到它到了队首,才会被handleMessage(Message msg)方法调用执行呢?