<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    amp@java

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      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");
            }
        };
    }

    根據mars的解釋,handler所在的線程跟Activity的線程是同一個線程,所以在
    handler.post(r);
    語句后,執行的是Runnable里面的run函數,這個函數沒有在新開的線程中執行,只是簡單地調用了run函數,所以這個app在模擬器運行時要過10秒才會顯示界面,因為run函數里面睡眠了10秒,等它返回后才執行setContentView函數設置界面元素。
    根據實際運行結果,的確是過了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函數里面睡眠后才執行的打印函數推遲了10秒才執行之外,其他都是沒有受到任何延時,順序執行的,在
    handler.post(r);
    語句前后的打印函數都被按順序執行了,唯獨
    setContentView(R.layout.main);
    需要在run函數返回后才執行,這是什么道理?難道打印函數的優先級更高,不會堵塞?如果是這樣的話為什么在run函數里面還是要等睡眠結束才執行呢?
    posted on 2012-02-09 19:25 amp@java 閱讀(1837) 評論(6)  編輯  收藏

    評論

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

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

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

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

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

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


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


    網站導航:
     
    主站蜘蛛池模板: 国产免费拔擦拔擦8x| 在线a人片天堂免费观看高清| 亚洲综合色在线观看亚洲| 在线观看亚洲网站| 国产三级免费观看| 白白色免费在线视频| 亚洲第一区在线观看| 成人黄色免费网站| 亚洲欧洲日产韩国在线| 黄+色+性+人免费| 亚洲人6666成人观看| 亚洲欧洲免费无码| 亚洲精品无码不卡在线播放| 国产成人免费a在线视频app | 亚洲福利精品电影在线观看| 偷自拍亚洲视频在线观看| 亚洲成a人片在线观看久| 九九99热免费最新版| 亚洲国产精品久久久久| 日韩免费精品视频| 亚洲AV无码男人的天堂| 久久久久亚洲av成人无码电影| a级毛片毛片免费观看久潮喷 | 无码国产精品一区二区免费式影视 | 在线免费观看亚洲| 国产精品亚洲综合久久| 免费永久看黄在线观看app| ww在线观视频免费观看w| 77777_亚洲午夜久久多人| 成人毛片免费网站| 一级片在线免费看| 亚洲黄色网址在线观看| 国产精品色午夜免费视频| 国内精品99亚洲免费高清| 亚洲一级毛片在线观| 亚洲国产成人久久综合一区77| 一级做a爰全过程免费视频| 亚洲乱亚洲乱妇24p| 亚洲人成精品久久久久| 成人毛片免费视频| 免费国产成人α片|