這是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函數里面還是要等睡眠結束才執行呢?