Android Handler的使用(二)

來源:互聯網
上載者:User
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了

//handler.post(r); 
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中儲存的值。
看一下輸出結果:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.