android線程運行
Ⅰ android怎麼讓代碼在UI線程運行
稍微有過Andorid開發經驗的同學都知道,Android開發中涉及到UI變動的操作,必須在主線程中執行, 否則會crash
這就需要我們將代碼拋到主線程執行。
第一種方式,是通過Activity.runOnUiThread()來做。這不是一個好方法,畢竟Activity這種東西,在子線程中可遇不可求。也千萬不要因此而將Activity傳來傳去,甚至對Context進行強轉,那樣太過難看。
那麼,只剩下通過Handler手動將代碼拋到主線程了。這就需要,Handler具有主線程的Looper對象。具體的原因可以參考我之前的博客:【Android】結合源碼解析Android消息隊列工作流程 。
兩種實現方式:
1. 在主線程中創建Handler
2. 直接通過MainLooper,構造handler
http://blog.csdn.net/u013015161/article/details/52760207
Ⅱ Android中線程與線程,進程與進程之間如何通信
使用handler發送message,消息隊列排隊
進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。
進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間並發執行的程度。
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定。線程的運行中需要使用計算機的內存資源和CPU。
Ⅲ android中主線程執行時,子線程執行嗎
執行,但一般不與視圖交互,因為在android 中還有一個headler概念,我對這塊也不是特別清楚
Ⅳ Android中的線程與進程之間的關系簡單解釋
一、Android中的進程
當一個程序第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。默認的情況下,所有該程序的組件都將在該進程和線程中運行。 同時,Android會為每個應用程序分配一個單獨的LINUX用戶。Android會盡量保留一個正在運行進程,只在內存資源出現不足時,Android會嘗試停止一些進程從而釋放足夠的資源給其他新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時地響應用戶的事件。
我們可以將一些組件運行在其他進程中,並且可以為任意的進程添加線程。組件運行在哪個進程中是在manifest文件里設置的,其中<Activity>,<Service>,<receiver>和<provider>都有一個process屬性來指定該組件運行在哪個進程之中。我們可以設置這個屬性,使得每個組件運行在它們自己的進程中,或是幾個組件共同享用一個進程,或是不共同享用。<application>元素也有一個process屬性,用來指定所有的組件的默認屬性。
Android中的所有組件都在指定的進程中的主線程中實例化的,對組件的系統調用也是由主線程發出的。每個實例不會建立新的線程。對系統調用進行響應的方法——例如負責執行用戶動作的View.onKeyDown()和組件的生命周期函數——都是運行在這個主線程中的。這意味著當系統調用這個組件時,這個組件不能長時間的阻塞主線程。例如進行網路操作時或是更新UI時,如果運行時間較長,就不能直接在主線程中運行,因為這樣會阻塞這個進程中其他的組件,我們可以將這樣的組件分配到新建的線程中或是其他的線程中運行。
二、Android中的線程
線程在代碼是使用標準的java Thread對象來建立,那麼在Android系統中提供了一系列方便的類來管理線程——Looper用來在一個線程中執行消息循環,Handler用來處理消息,HandlerThread創建帶有消息循環的線程。
三、進程與線程的關系
它們之間的區別:
1、線程是進程的一部分,所以線程有的時候被稱為是輕權進程或者輕量級進程。
2、一個沒有線程的進程是可以被看作單線程的,如果一個進程內擁有多個進程,進程的執行過程不是一條線(線程)的,而是多條線(線程)共同完成的。
3、系統在運行的時候會為每個進程分配不同的內存區域,但是不會為線程分配內存(線程所使用的資源是它所屬的進程的資源),線程組只能共享資源。那就是說,出了CPU之外(線程在運行的時候要佔用CPU資源),計算機內部的軟硬體資源的分配與線程無關,線程只能共享它所屬進程的資源。
4、與進程的控製表PCB相似,線程也有自己的控製表TCB,但是TCB中所保存的線程狀態比PCB表中少多了。
5、進程是系統所有資源分配時候的一個基本單位,擁有一個完整的虛擬空間地址,並不依賴線程而獨立存在。
它們之間的聯系:
簡單的說就是:一個程序包含進程,進程又包含線程,線程是進程的一個組成部分,進程是操作系統分配資源的基本單位,線程是不會分配資源的,一個進程可以包含多個線程,然後這些線程共享進程的資源。
分開來說就是:
線程是進程的一個實體,是CPU 調度和分配的基本單位,其本身不擁有系統資源,只含有程序計數器、寄存器和棧等一些運行時必不可少的基本資源。同屬一個進程的線程共享進程中的全部資源。
進程是系統資源分配時的一個基本單位,擁有一個完整的虛擬空間地址。
系統在運行的時候會為每個進程分配不同的內存區域。
線程組只能共享資源,即除了CPU外,計算機內部的軟硬體資源的分配與線程無關,線程只能共享它所屬進程的資源。
Ⅳ Android里有哪些方法啟動線程
其實Android啟動線程和JAVA一樣有兩種方式,一種是直接Thread類的start方法,也就是一般寫一個自己的類來繼承Thread類。另外一種方式其實和這個差不多啊! 那就是Runnable介面,然後把Runnable的子類對象傳遞給Thread類再創建Thread對象.總之都是需要創建Thread對象,然後調用Thread類的start方法啟動線程。區別就是,一個是直接創建Thread對象,另外一個是需要implement了Runnable介面對象作為創建Thread對象的參數。Runnable其實我們稱為線程任務。
第一種方式一般是這樣用:
Class MyThread extends Thread{
public void run(){
//你要實現的代碼
}
}
在主線程中啟動這個線程:
public class Test{
public static void main(String[] args){
new MyThread().start();//啟動了我們的線程了
}
}
2,第二種方式一般是這樣用:
public class MyRunnable implements Runnable{
public void run(){
//你需要實現的代碼
}
}
在主線程中啟動這個線程:
public class Test{
public static void main(String[] args){
Thread t=new Thread(new MyRunnable());//這里比第一種創建線程對象多了個任務對象
t.start();
}
}
這里我想說的是可能你問這個問題是接觸到了Android中的Handler概念:
其實Handler並不是開辟新線程的概念,Android主要的考慮到更新界面的問題,一般情況下,更新界面(Activity)都是在主線程中更新的,這樣就遇到了一個問題,比方說:在下載文件時候我們需要進度條顯示下載進度,界面需要更新(數據是不斷變的,也就是下載的大小是不斷變的,要是直接在主線程中更新,就會造成程序的堵塞,程序很容易崩潰,通常這樣聯網耗時的工作需要開辟另外一個線程的,這樣就不會影響主程序了),好了,到這里聯網操作一般都需要開辟新線程了吧。。
接下來就來說Handler了,剛剛我說了Handler不是開辟新線程,在我看來,Handler更像是主線程的秘書,是一個觸發器,負責管理從子線程中得到更新的數據,然後在主線程中更新界面。簡單說下進度條的那個:
下載了多少的數據都是在子線程中得到的,在子線程中通過Handler的sendMessage()方法發送得到的下載的數據,當你調用了sendMessage方法後,Handler就會回調(也就是自動調用)Handler中的 HandlerMessage方法。
我很認真寫了,希望分給我! 要是還有不懂的,可以追問,總之Handler不是開辟線程,開辟線程的方式就和JAVA一樣的! 千萬不要被Android中的Handler混淆。
Ⅵ 三,android系統的線程運行方式是怎樣的,main thread 和 worker thread的各自作用
主線程呢,主要是負責一些界面的繪制和刷新,但非主線程呢,主要是進行一些數據的獲取、網路的請求等等一些耗時的操作。