<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之間執行的呢?  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 老司机亚洲精品影院无码| 国产亚洲无线码一区二区 | 国产亚洲精品免费视频播放| 亚洲&#228;v永久无码精品天堂久久 | 亚洲高清国产拍精品熟女| 免费看少妇作爱视频| 亚洲av纯肉无码精品动漫| 国产成人免费片在线观看| 国产91成人精品亚洲精品| 亚洲成A∨人片天堂网无码| a高清免费毛片久久| 亚洲AV综合色一区二区三区| 2021免费日韩视频网| 久久久亚洲AV波多野结衣 | 最好看的中文字幕2019免费| 亚洲中文字幕人成乱码| 好吊妞在线新免费视频| 特黄特色大片免费| 亚洲熟女一区二区三区| 蜜臀98精品国产免费观看| 亚洲中文字幕久久精品无码A| 一区二区三区免费高清视频| 中文字幕亚洲日本岛国片| 可以免费观看的毛片| 亚洲一区二区三区免费视频| 免费高清在线影片一区| 一区二区3区免费视频| 亚洲日韩图片专区第1页| 97视频热人人精品免费| 一级免费黄色大片| 亚洲精品在线免费观看| 国产成人啪精品视频免费网| 韩日电影在线播放免费版| 亚洲视频手机在线| 在线观看免费精品国产| 久久er国产精品免费观看8| 亚洲欧洲国产综合| 国内精品99亚洲免费高清| 亚洲w码欧洲s码免费| 一级毛片在线播放免费| 亚洲福利视频网址|