這是mars課程里面關于handler和線程的一個例子:
根據(jù)mars的解釋,handler所在的線程跟Activity的線程是同一個線程,所以在
根據(jù)實際運行結果,的確是過了10秒才能顯示界面。
但是奇怪的是System.out語句似乎沒有受到影響,下面是日志:
從日志可以看出,除了run函數(shù)里面睡眠后才執(zhí)行的打印函數(shù)推遲了10秒才執(zhí)行之外,其他都是沒有受到任何延時,順序執(zhí)行的,在
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");
}
};
}
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");
}
};
}
根據(jù)mars的解釋,handler所在的線程跟Activity的線程是同一個線程,所以在
handler.post(r);
語句后,執(zhí)行的是Runnable里面的run函數(shù),這個函數(shù)沒有在新開的線程中執(zhí)行,只是簡單地調用了run函數(shù),所以這個app在模擬器運行時要過10秒才會顯示界面,因為run函數(shù)里面睡眠了10秒,等它返回后才執(zhí)行setContentView函數(shù)設置界面元素。根據(jù)實際運行結果,的確是過了10秒才能顯示界面。
但是奇怪的是System.out語句似乎沒有受到影響,下面是日志:
從日志可以看出,除了run函數(shù)里面睡眠后才執(zhí)行的打印函數(shù)推遲了10秒才執(zhí)行之外,其他都是沒有受到任何延時,順序執(zhí)行的,在
handler.post(r);
語句前后的打印函數(shù)都被按順序執(zhí)行了,唯獨setContentView(R.layout.main);
需要在run函數(shù)返回后才執(zhí)行,這是什么道理?難道打印函數(shù)的優(yōu)先級更高,不會堵塞?如果是這樣的話為什么在run函數(shù)里面還是要等睡眠結束才執(zhí)行呢?