package cc.line;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;public class line extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler.post(line);
        setContentView(R.layout.main);
        System.out.println("main"+Thread.currentThread().getId());
           }
    Handler handler=new Handler();
    Runnable line=new Runnable() {

public void run() {

System.out.println("run"+Thread.currentThread().getId()); try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}为什么输出的先是main,后是run
setContentView(R.layout.main);这句话是在handler.post()后面运行的,在Activity显示之前main就输出了 这是为什么?

解决方案 »

  1.   

    测试了一下。貌似要在主线程把初始化事情做完先,在onResume方法执行完毕后才处理消息队列里的东西。
    不知道别的朋友是怎么理解的。
      

  2.   

    Handler 是启动了另一个线程,而此时的主线程不会阻塞。显然启动一个线程比setContentView更耗时
      

  3.   

    是在同一个线程。以下才会开启新线程专门处理,且通过下面方法测试了几次,run方法里打印出的东西在前面。当然这种前后可能是不确定性的。。
    HandlerThread ht = new HandlerThread("King");
    ht.start();
    handler = new Handler(ht.getLooper())
      

  4.   

    这个结果一定是main thread 先执行,然后再是line thread 执行。原因如下:1.首先main thread 和 line thread 都属于UI线程。
    2.handler.post(line) 是把line 这个runnalbe 发送到 UI线程的消息队列中。而消息队列是先进先出的。
    3.在line到达UI的消息队列之前,已经有一个消息在执行了。这就是 UI主线程在执行,其执行顺序是:
    onCreate()-> onStart()-> onResume() ->run 
    只有到达run区域时, 才会从消息队列取出新的信息,进行操作。所以无论你把 handler.post(line)放在哪里,都先看到main 然后才是line楼主可将
    System.out.println("run"+Thread.currentThread().getId());            try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    放到onCreate方法里,试试就知道了。
      

  5.   

     Thread.sleep(10000);
    你是先停了10秒再setContentView的吧
      

  6.   

    Handler 是启动了另一个线程,而此时的主线程不会阻塞。显然启动一个线程比setContentView更耗时
      

  7.   


    2.1的avd运行2.1的工程没问题,2.2的avd运行2.2的工程一直停留再开机界面,控制台一直是 
     Waiting for HOME ('android.process.acore') to be launched...
    哪位大侠帮我解决下啊 
      

  8.   


    Thread.sleep(10000);
      } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      }哥 sleep 是Thread类得一个静态方法啊
    你在在onCreate中,就是让UI线程睡10秒啊
      

  9.   

    Handler 是启动了另一个线程,而此时的主线程不会阻塞。显然启动一个线程比setContentView更耗时
    [/Quote]
      

  10.   

    handler是启动了一个新的线程,不会阻塞主线程。启动新的线程需要时间,所以会先出现main
      

  11.   

    你的这个handler也是在ui线程中的,只有在onCreate执行完成之后才会发现, 哟, 原来还有印务等待执行哟、呵呵