这是mars课程里面关于handler和线程的一个例子:
package mars.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class HandlerTest extends Activity {
Handler handler = new Handler();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("1");
handler.post(r);
System.out.println("2");
setContentView(R.layout.main);
System.out.println("activity---->"+Thread.currentThread().getId());
System.out.println("activity name--->"+Thread.currentThread().getName());
}
Runnable r = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("handler---->"+Thread.currentThread().getId());
System.out.println("handlername---->"+Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("3");
}
};
}
根据mars的解释,handler所在的线程跟Activity的线程是同一个线程,所以在
handler.post(r);
语句后,执行的是Runnable里面的run函数,这个函数没有在新开的线程中执行,只是简单地调用了run函数,所以这个app在模拟器运行时要过10秒才会显示界面,因为run函数里面睡眠了10秒,等它返回后才执行setContentView函数设置界面元素。
根据实际运行结果,的确是过了10秒才能显示界面。
但是奇怪的是System.out语句似乎没有受到影响,下面是日志:
从日志可以看出,除了run函数里面睡眠后才执行的打印函数推迟了10秒才执行之外,其他都是没有受到任何延时,顺序执行的,在
handler.post(r);
语句前后的打印函数都被按顺序执行了,唯独
setContentView(R.layout.main);
需要在run函数返回后才执行,这是什么道理?难道打印函数的优先级更高,不会堵塞?如果是这样的话为什么在run函数里面还是要等睡眠结束才执行呢?