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


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


    網站導航:
     
    主站蜘蛛池模板: 最好看的中文字幕2019免费| 色播在线永久免费视频网站| 无码国产精品一区二区免费式直播| 亚洲区小说区图片区| 日韩精品无码免费视频| 亚洲成?Ⅴ人在线观看无码| 牛牛在线精品免费视频观看| 国产在线19禁免费观看| 久久精品国产亚洲av品善| 国产精品公开免费视频| 久久亚洲精品高潮综合色a片| 日本免费无遮挡吸乳视频电影| 亚洲一区二区三区丝袜| 卡一卡二卡三在线入口免费| 久久亚洲精品11p| 亚洲日本一区二区三区在线不卡| av成人免费电影| 亚洲AV综合色区无码另类小说| 国产高清不卡免费视频| 亚洲综合日韩中文字幕v在线| 91人成网站色www免费下载| 亚洲欧洲春色校园另类小说| 欧美男同gv免费网站观看| 亚洲www77777| 久久精品国产精品亚洲人人| 免费人成视频在线观看网站| 亚洲一区动漫卡通在线播放| 日韩免费视频播播| 中文字幕乱码免费看电影| 久久久久亚洲AV成人片| 噼里啪啦电影在线观看免费高清| 国产午夜亚洲精品不卡免下载| 久久久久亚洲?V成人无码| 99久久免费中文字幕精品| 亚洲自偷自偷在线成人网站传媒| 免费精品国产自产拍观看| 国产午夜免费高清久久影院| 亚洲色大成网站www尤物| 亚洲永久无码3D动漫一区| 精品香蕉在线观看免费| 一级毛片a免费播放王色电影 |