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


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


    網站導航:
     
    主站蜘蛛池模板: 日本永久免费a∨在线视频| 久久夜色精品国产噜噜亚洲a| 色屁屁在线观看视频免费| 性一交一乱一视频免费看| 最新国产成人亚洲精品影院| 人妻视频一区二区三区免费| 亚洲一级特黄特黄的大片 | 一级毛片在线免费看| 亚洲AV人人澡人人爽人人夜夜| 两个人看的www免费视频| 亚洲VA中文字幕无码一二三区| 久久九九全国免费| 亚洲精品美女在线观看播放| 美女视频黄的全免费视频| 亚洲AV永久无码天堂影院| 尤物永久免费AV无码网站| 免费国产va在线观看| 久久影视国产亚洲| 67194成手机免费观看| 亚洲色欲色欲www在线播放| jjzz亚洲亚洲女人| 亚洲国产精品免费视频| 亚洲人成在久久综合网站| 日本免费人成黄页网观看视频 | 美女羞羞视频免费网站| 亚洲日本韩国在线| 先锋影音资源片午夜在线观看视频免费播放| 亚洲国产成人久久综合碰碰动漫3d | 无码日韩精品一区二区免费| 亚洲AV综合色区无码一二三区| 亚洲无码高清在线观看| 人妻丰满熟妇无码区免费| 亚洲午夜无码久久| 亚洲国产婷婷六月丁香| 香蕉97超级碰碰碰免费公| 一级片在线免费看| 亚洲另类古典武侠| 国产成人亚洲精品狼色在线| av无码国产在线看免费网站| 一个人看的在线免费视频| 亚洲国产夜色在线观看|