代码如下: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有什么关系么,请高手帮我解答一下。
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有什么关系么,请高手帮我解答一下。
updateRunnable,id--------->1
updateRunnable,name--------->main
mainThread,id------------->1
mainThread,name----------->main
end
还没有执行完的时候就提前打印了主线程的输出语句,那主线程的队列里面装的都是什么呀,还是说主线程中有很多个队列,不同队列所负责的任务不同?有的队列负责打印输出,有的负责执行类似于setContentView(R.layout.main);这样的功能?
现在main UI的队列上正在执行OnCreate,而你的打印函数正好是要接下来执行的。
另外,每个线程只有一个队列。
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());
}
};
}
变成这样的时候,屏幕上还没有显示出来布局,可却已经打印出来了主线程的输出了,这个又作何解释呀?
然后执行的输出,至于没显示出布局就输出了语句,那是因为显示布局不是你想象的那么快,输出语句当然很快了!
假如我什么都没有写,直接setContentView(R.layout.main);我很快就看见了呀,而我写的这个代码出现的时间正好是我设置的睡眠时间。。
loop会一直进行下去
这里的情况就是onCreate执行后,loop到你放的updateThread2,这个Msg的Callback就是run(),此时就执行了run里的代码了
我明白了,setContextView()是在另外一个进程执行的,这条语句形象说就是给了一个信号,他在onCreateView中的位置无关。可以说总是在最后执行的。。所以会先打印