amp@java

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            99 隨筆 :: 0 文章 :: 228 評論 :: 0 Trackbacks
          這是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");
                  }
              };
          }

          根據(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語句似乎沒有受到影響,下面是日志:
          log
          02-09 11:12:43.553: INFO/System.out(591): 1
          02-09 11:12:43.553: INFO/System.out(591): 2
          02-09 11:12:43.674: INFO/System.out(591): activity---->1
          02-09 11:12:43.674: INFO/System.out(591): activity name--->main
          02-09 11:12:43.713: INFO/System.out(591): handler---->1
          02-09 11:12:43.713: INFO/System.out(591): handlername---->main
          02-09 11:12:53.775: INFO/System.out(591): 3

          從日志可以看出,除了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í)行呢?
          posted on 2012-02-09 19:25 amp@java 閱讀(1837) 評論(6)  編輯  收藏

          評論

          # re: Activity里一個奇怪的執(zhí)行順序 2012-02-09 20:21 dzwillpower
          這個問題我也覺得很奇怪,為什么沒有人回答呢,求高手解答啊  回復  更多評論
            

          # re: Activity里一個奇怪的執(zhí)行順序 2012-02-10 10:11 小權
          handler.post(r);
          是將runnable對象post到主線程消息隊列的隊尾,等主線程取出這個消息對象的時候才會執(zhí)行這個runnable中的run方法。

          這樣就是你為什么看到最后執(zhí)行run方法的原因。

          API:
          public final boolean post (Runnable r)

          Since: API Level 1
          Causes the Runnable r to be added to the message queue. The runnable will be run on the thread to which this handler is attached.  回復  更多評論
            

          # re: Activity里一個奇怪的執(zhí)行順序 2012-02-10 10:29 amp@java
          @小權
          但是這兩句:
          setContentView(R.layout.main);
          System.out.println("activity---->"+Thread.currentThread().getId());
          都是在
          handler.post(r);
          后面,實際效果卻是后面那句比前面那句先執(zhí)行,是不是
          setContentView
          實際上也是放到消息隊列里,馬上返回但并沒有立即執(zhí)行的原因?
            回復  更多評論
            

          # re: Java編程打開運行exe程序 2012-02-11 11:06 tb
          恩不錯呀!  回復  更多評論
            

          # re: Activity里一個奇怪的執(zhí)行順序 2012-03-09 17:15 futurexiong
          今天群里的一個人拿著你這貼子問了問題,所以,我在這里回復一下吧。由于Activity的顯示是在onResume之后,所以給你的感覺是setContentView并沒有執(zhí)行,實際上這個方法并不是顯示界面,你把概念搞混了。實際上這個方法在run方法之前已經執(zhí)行了。mars的解釋是有問題的。如果你不相信,在setContentView下面使用findViewById方法把TextView拿到并打印出TextView的內容,看看是否執(zhí)行了。生命周期一定要搞清楚。  回復  更多評論
            

          # re: Activity里一個奇怪的執(zhí)行順序 2012-03-15 09:42 amp@java
          @futurexiong
          是不是說run方法是在onCreate和onResume之間執(zhí)行的呢?  回復  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 得荣县| 安图县| 白水县| 治多县| 万安县| 疏附县| 西畴县| 华亭县| 柳州市| 惠水县| 苍山县| 嘉定区| 博野县| 康定县| 汤原县| 科尔| 留坝县| 桃江县| 西青区| 三穗县| 潜江市| 杂多县| 大丰市| 绥德县| 通化县| 罗定市| 岢岚县| 漳州市| 宣威市| 维西| 五台县| 闸北区| 奉贤区| 莒南县| 威海市| 桂阳县| 定结县| 柳江县| 崇左市| 宁海县| 武平县|