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


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲va中文字幕无码久久不卡| 免费鲁丝片一级观看| 亚洲天堂免费在线视频| 女人裸身j部免费视频无遮挡| 妞干网免费视频观看| 亚洲人成人伊人成综合网无码 | 大妹子影视剧在线观看全集免费| 亚洲精品国产精品国自产观看 | 久久精品国产精品亚洲艾| 国产午夜免费高清久久影院| 亚洲国产精品无码久久SM| 2015日韩永久免费视频播放 | 4444亚洲国产成人精品| 91成人免费观看网站| 亚洲日本久久久午夜精品| 国产色婷婷精品免费视频| 日本黄页网址在线看免费不卡| 亚洲国产黄在线观看| 中文字幕一区二区三区免费视频| 亚洲AV综合色一区二区三区| 亚洲免费视频网站| 自拍日韩亚洲一区在线| 免费欧洲毛片A级视频无风险| a一级毛片免费高清在线| 亚洲国产一区国产亚洲| 国产h视频在线观看免费| 色屁屁在线观看视频免费| 亚洲精品V欧洲精品V日韩精品 | 曰批全过程免费视频观看免费软件 | 男女男精品网站免费观看| 亚洲国产另类久久久精品小说| 成年人网站免费视频| 老子影院午夜伦不卡亚洲| 337p日本欧洲亚洲大胆裸体艺术| 亚洲免费网站在线观看| 曰批全过程免费视频观看免费软件| 亚洲va在线va天堂va不卡下载| 大地资源在线观看免费高清| 国产免费播放一区二区| 亚洲avav天堂av在线网爱情| 亚洲人成人网站在线观看|