amp@java

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            99 隨筆 :: 0 文章 :: 228 評(píng)論 :: 0 Trackbacks
          這是mars課程里面關(guān)于handler和線程的一個(gè)例子:
          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的解釋?zhuān)琱andler所在的線程跟Activity的線程是同一個(gè)線程,所以在
          handler.post(r);
          語(yǔ)句后,執(zhí)行的是Runnable里面的run函數(shù),這個(gè)函數(shù)沒(méi)有在新開(kāi)的線程中執(zhí)行,只是簡(jiǎn)單地調(diào)用了run函數(shù),所以這個(gè)app在模擬器運(yùn)行時(shí)要過(guò)10秒才會(huì)顯示界面,因?yàn)閞un函數(shù)里面睡眠了10秒,等它返回后才執(zhí)行setContentView函數(shù)設(shè)置界面元素。
          根據(jù)實(shí)際運(yùn)行結(jié)果,的確是過(guò)了10秒才能顯示界面。

          但是奇怪的是System.out語(yǔ)句似乎沒(méi)有受到影響,下面是日志:
          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í)行之外,其他都是沒(méi)有受到任何延時(shí),順序執(zhí)行的,在
          handler.post(r);
          語(yǔ)句前后的打印函數(shù)都被按順序執(zhí)行了,唯獨(dú)
          setContentView(R.layout.main);
          需要在run函數(shù)返回后才執(zhí)行,這是什么道理?難道打印函數(shù)的優(yōu)先級(jí)更高,不會(huì)堵塞?如果是這樣的話為什么在run函數(shù)里面還是要等睡眠結(jié)束才執(zhí)行呢?
          posted on 2012-02-09 19:25 amp@java 閱讀(1837) 評(píng)論(6)  編輯  收藏

          評(píng)論

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

          # re: Activity里一個(gè)奇怪的執(zhí)行順序 2012-02-10 10:11 小權(quán)
          handler.post(r);
          是將runnable對(duì)象post到主線程消息隊(duì)列的隊(duì)尾,等主線程取出這個(gè)消息對(duì)象的時(shí)候才會(huì)執(zhí)行這個(gè)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.  回復(fù)  更多評(píng)論
            

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

          # re: Java編程打開(kāi)運(yùn)行exe程序 2012-02-11 11:06 tb
          恩不錯(cuò)呀!  回復(fù)  更多評(píng)論
            

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

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


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 河西区| 焦作市| 海城市| 宁都县| 区。| 永靖县| 宜阳县| 蓬莱市| 德昌县| 普安县| 阳东县| 永春县| 云安县| 高唐县| 灌南县| 景德镇市| 林西县| 宣城市| 彭水| 德格县| 伊春市| 乐东| 浮梁县| 台中县| 湘乡市| 宕昌县| 巢湖市| 若尔盖县| 宣恩县| 靖州| 虹口区| 龙川县| 德阳市| 佛教| 大宁县| 安图县| 金华市| 温州市| 大冶市| 临澧县| 邹城市|