Android Handler的使用(二)
? ?? ? 一、 Handler與線程的關系
? ?? ? Handler在默認情況下,實際上它和調用它的Activity是處于同一個線程的。
例如在Handler的使用(一)的示例1中,雖然聲明了線程對象,但是在實際調用當中它并沒有調用線程的start()方法,而是直接調用當前線程的run()方法。
? ?? ? 通過一個例子來證實一下
? ?? ? 示例1:一個Android應用程序,在Activity中創建Handler和線程對象,并且在Activity的onCreate()方法中輸出當前線程的id和名字,然后在線程對象的run方法中也打印輸出下當前線程的id和名字。如果說,Activity輸出的結果與線程對象輸出的結果是一樣的,那么就表示它們使用的是同一個線程。
下面是Activity代碼: package?eoe.demo;?
import?android.app.Activity;?
import?android.os.Bundle;?
import?android.os.Handler;?
public?class?HandlerTwo?extends?Activity?{?
/**?Called?when?the?activity?is?first?created.?*/?
Handler?handler?=?new?Handler();?
@Override?
public?void?onCreate(Bundle?savedInstanceState)?{?
super.onCreate(savedInstanceState);?
//在設置布局文件之前先調用post方法,?
//表示在執行完線程之后才會顯示布局文件中的內容,而線程中又設置了休眠10秒鐘,?
//所以最終效果為,先顯示應用程序主界面,等待10秒鐘之后才顯示布局文件中的內容?
handler.post(r);?
setContentView(R.layout.main);?
System.out.println("activity?id--->"+Thread.currentThread().getId());?
System.out.println("activity?name--->"+Thread.currentThread().getName());?
}?
Runnable?r?=?new?Runnable(){?
public?void?run()?{?
//輸出當前線程的id和name?
//如果這里輸出的線程id、name與上面onCreate()方法中輸出的線程id、name相同的話,?
//那么則表示,他們使用的是同一個線程?
System.out.println("runnable_id--->"+Thread.currentThread().getId());?
System.out.println("runnable_name--->"+Thread.currentThread().getName());?
try{?
Thread.sleep(10000);?//讓線程休眠10秒?
}catch(InterruptedException?e){?
e.printStackTrace();?
}?
}?
};?
}?下圖是執行的結果:
? ?? ? 根據結果可以看出,兩個輸出的id和name都相同,它們使用的是同一個線程。 
? ?? ? 現在將Activity中的代碼修改一下,新建一個線程Thread,然后調用線程的start()方法,再觀察一下控制臺的輸出結果。 
? ?? ? 這里只要將上面的代碼稍微修改一下就可以了 
? ?? ? 1、先將handler.post(r)注釋掉 
? ?? ? 2、再添加下面兩句代碼就OK了 
Thread?t?=?new?Thread(r);?
t.start();?
輸出結果: 
? ?? ? 從這個輸出結果中可以看出,這次線程對象的id、name與activity里的線程id、name完全不一樣了,由此可見,它們現在使用的不是同一個線程。 
? ?? ? 這個例子中還掩飾了一個效果,就是平時我們是將Handler的post()方法放在setContentView(R.layout.main)這個方法之后調用,將設置完布局之后再執行其他的操作,而在這個例子中,是將Handler的post()方法放在setContent()方法之前調用,而post里傳遞的線程對象的run()方法呢,又執行了休眠線程10秒鐘,所以運行實現的效果會是,當程序運行后,首先Activity上沒有任何內容,過來10秒之后,才會顯示Activity里的內容。 
? ?? ? 二、 Bundle和如何在新線程中處理消息 
? ?? ? 首先介紹一下Bundle: 
? ?? ? Bundle它是一個以string為鍵,可以由其他數據類型作為值的一個mapping,相當于把數據當成一個包。在初學的階段可以將它當成特殊的一個HashMap對象,不過HashMap的鍵和值都是Object類型的,而Bundle的鍵卻是String類型。 
? ?? ? 通過一個例子來使用一下Bundle和如何在新線程中處理消息 
? ?? ? 示例2:一個Android應用程序,先打印Activity當前使用的線程id,然后再創建一個新線程,使用Bundl存儲值,最后打印出線程的id和Bundle中存儲的值。 
看一下輸出結果: 
轉載于:https://www.cnblogs.com/zziss/archive/2012/02/14/2351955.html
總結
以上是生活随笔為你收集整理的Android Handler的使用(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: “塞鸿声急欲霜天”上一句是什么
 - 下一篇: 索纳塔多少钱啊?