android開發之多線程實現方法概述


一、單線程模型

 

當一個程序第一次啟動時,Android會同時啟動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如:用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。

在開發Android 應用時必須遵守單線程模型的原則: Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。

如果在非UI線程中直接操作UI線程,會拋出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views,這與普通的java程序不同。

由於UI線程負責事件的監聽和繪圖,因此,必須保證UI線程能夠隨時響應用戶的需求,UI線程里的操作應該向中斷事件那樣短小,費時的操作(如網絡連接)需要另開線程,否則,如果UI線程超過5s沒有響應用戶請求,會彈出對話框提醒用戶終止應用程序。

如果在新開的線程中需要對UI進行設定,就可能違反單線程模型,因此android采用一種復雜的Message Queue機制保證線程間通信。

Message Queue:

Message Queue是一個消息隊列,用來存放通過Handler發布的消息。Android在第一次啟動程序時會默認會為UI thread創建一個關聯的消息隊列,可以通過Looper.myQueue()得到當前線程的消息隊列,用來管理程序的一些上層組件,activities,broadcast receivers 等等。你可以在自己的子線程中創建Handler與UI thread通訊。 

通過Handler你可以發布或者處理一個消息或者是一個Runnable的實例。每個Handler都會與唯一的一個線程以及該線程的消息隊列管理。

Looper扮演着一個Handler和消息隊列之間通訊橋梁的角色。程序組件首先通過Handler把消息傳遞給Looper,Looper把消息放入隊列。Looper也把消息隊列里的消息廣播給所有的Handler,Handler接受到消息后調用handleMessage進行處理。

(以上轉自http://www.cnblogs.com/nio-nio/archive/2012/07/23/2604900.html)

二、多線程的實現

有以下幾種方式:  

1)Activity.runOnUiThread(Runnable)  

2)View.post(Runnable) ;View.postDelay(Runnable , long)  

3)Handler  

4)AsyncTask  

Android是單線程模型,這意味着Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行,所以你單純的new一個Thread並且start()是不行的,因為這違背了Android的單線程模型。那么如何用好多線程呢?總結一下:  
事件處理的原則:所有可能耗時的操作都放到其他線程去處理。 

 對於第一種方法:

activity.runOnUiThread(new Runnable() {               
            @Override 
            public void run() {  
                // TODO Auto-generated method stub  
            	int i = 30;
            	textView.setText(""+i+" s");
            	}
            }  
        });  

第2,3種方法網絡上資料較多,不再贅述。第4種方法在上一篇博文中已經介紹。

 

三、總結:

1)android系統是單線程系統,為了實現多線程的效果,采用了message queue。

2)為實現多線程,可采用runOnUiThread,post,handle,AsyncTask技術實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM