代码如下:import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;public class Handlertest2Activity extends Activity {
    /** Called when the activity is first created. */
private ProgressBar txt=null;
private static int a=0;
private Handler handler=new Handler();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler.post(updateThread2);
     try{
     Thread.sleep(10000);
     }catch(Exception e){
     e.printStackTrace();
     }
        setContentView(R.layout.main);
        System.out.println("mainThread,id--------->"+Thread.currentThread().getId());
     System.out.println("mainName,name--------->"+Thread.currentThread().getName());  
System.out.println("end");
    }
    Runnable updateThread2=new Runnable(){
    
     @Override
     public void run() {
     // TODO Auto-generated method stub
     System.out.println("updateRunnable,id--------->"+Thread.currentThread().getId());
     System.out.println("updateRunnable,name--------->"+Thread.currentThread().getName());
    
     }
    };
}
结果是
mainThread,id------------->1
mainThread,name----------->main
end
updateRunnable,id--------->1
updateRunnable,name--------->main
我是想问,为什么不是updateThread先打印,而是主线程中的System.out都完成后才打印的,这其中是怎么回事,在代码上不是先出现的是handler.post(updateThread2);么,为啥会出现这样的情况,这与message queue以及looper有什么关系么,请高手帮我解答一下。

解决方案 »

  1.   

    因为你都是在主线程上运行的啊,handler.post(...)是在主线程中运行的。
      

  2.   

    我知道是在主线程运行的我的意思是为什么结果不是
    updateRunnable,id--------->1
    updateRunnable,name--------->main
    mainThread,id------------->1
    mainThread,name----------->main
    end
      

  3.   

    handler.post的结果是插入队列尾,但是要先执行完队列中的任务,然后执行下一个。
      

  4.   

    可是当setContentView(R.layout.main);
    还没有执行完的时候就提前打印了主线程的输出语句,那主线程的队列里面装的都是什么呀,还是说主线程中有很多个队列,不同队列所负责的任务不同?有的队列负责打印输出,有的负责执行类似于setContentView(R.layout.main);这样的功能?
      

  5.   

    setContentView和打印没有任何关系。一个activity甚至可以不设置content view。
    现在main UI的队列上正在执行OnCreate,而你的打印函数正好是要接下来执行的。
    另外,每个线程只有一个队列。
      

  6.   

    setContentView和输出语句都在onCreat函数里呀,他们的顺序是先后写的,难道不是按顺序执行的语句?当我把代码改成package com.itcast;import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.TextView;public class Handlertest2Activity extends Activity {
        /** Called when the activity is first created. */
    private ProgressBar txt=null;
    private static int a=0;
    private Handler handler=new Handler();
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            handler.post(updateThread2);
        
            setContentView(R.layout.main);
            System.out.println("mainThread,id--------->"+Thread.currentThread().getId());
         System.out.println("mainName,name--------->"+Thread.currentThread().getName());  
    System.out.println("end");
        }
        Runnable updateThread2=new Runnable(){
        
         @Override
         public void run() {
         // TODO Auto-generated method stub
         try{
         Thread.sleep(10000);
         }catch(Exception e){
         e.printStackTrace();
         }
         System.out.println("updateRunnable,id--------->"+Thread.currentThread().getId());
         System.out.println("updateRunnable,name--------->"+Thread.currentThread().getName());
        
         }
        };
    }
    变成这样的时候,屏幕上还没有显示出来布局,可却已经打印出来了主线程的输出了,这个又作何解释呀?
      

  7.   

    setConentView是用来设置layout的语句,和输出没关系。所以你是否调用它,你的输出结果都不会变化,明白?
      

  8.   

    这不可能吧,其实肯定是先执行了你那条 setContentView(R.layout.main);
    然后执行的输出,至于没显示出布局就输出了语句,那是因为显示布局不是你想象的那么快,输出语句当然很快了!
      

  9.   


    假如我什么都没有写,直接setContentView(R.layout.main);我很快就看见了呀,而我写的这个代码出现的时间正好是我设置的睡眠时间。。
      

  10.   

    post只是把这个这个消息放到loop里
    loop会一直进行下去
    这里的情况就是onCreate执行后,loop到你放的updateThread2,这个Msg的Callback就是run(),此时就执行了run里的代码了
      

  11.   

    这个现在理解了,现在问题是OnCreate()中setContextView()和System.out的顺序关系。
      

  12.   

    你打印时间看看,你layout很简单,你感觉很快的,其实是有先后顺序的
      

  13.   


    我明白了,setContextView()是在另外一个进程执行的,这条语句形象说就是给了一个信号,他在onCreateView中的位置无关。可以说总是在最后执行的。。所以会先打印