android主線程判斷
㈠ Android中判斷當前線程是否是主線程
在java-mian線程中Thread.currentThread().getName() == "main";
你可以做個android程序在主線程里獲取當前線程名Thread.currentThread().getName();以後在其他線程里就獲取當前線程名與之比較Thread.currentThread().getName().equals("main");
㈡ Android 如何創建子線程以及區分主線程
在一個Android 程序開始運行的時候,會單獨啟動一個Process。默認的情況下,所有這個程序中的Activity或者Service(Service和 Activity只是Android提供的Components中的兩種,除此之外還有Content Provider和Broadcast Receiver)都會跑在這個Process。
一個Android 程序默認情況下也只有一個Process,但一個Process下卻可以有許多個Thread。在這么多Thread當中,有一個Thread,我們稱之為UI Thread。UI Thread在Android程序運行的時候就被創建,是一個Process當中的主線程Main Thread,主要是負責控制UI界面的顯示、更新和控制項交互。在Android程序創建之初,一個Process呈現的是單線程模型,所有的任務都在一個線程中運行。因此,我們認為,UI Thread所執行的每一個函數,所花費的時間都應該是越短越好。而其他比較費時的工作(訪問網路,下載數據,查詢資料庫等),都應該交由子線程去執行,以免阻塞主線程。
那麼,UI Thread如何和其他Thread一起工作呢?常用方法是:
誕生一個主線程的Handler物件,當做Listener去讓子線程能將訊息Push到主線程的Message Quene里,以便觸發主線程的handlerMessage()函數,讓主線程知道子線程的狀態,並在主線程更新UI。
㈢ android中什麼是主線程什麼是子線程
一個app開始運行就會創建一個主線程,其他子線程都是在主線程中創建的。每個app都有一個主線程,但每個app並不一定有子線程。
㈣ android判斷一個線程是否存在
線程如果是一直運行的,就檢測service是否已經啟動,啟動了就不開啟線程。每次開啟程序就啟動服務,線程也新建,建議看一下service的生命周期。。
㈤ Android進程和線程的區別
Android進程和線程的區別
下面我先介紹下Android進程和線程各是什麼,然後再一一比較區別下
Android進程基本知識:
當一個程序第一次啟動的時候,Android會啟動一個LINUX進程和一個主線程。默認的情況下,所有該程序的組件都將在該進程和線程中運行。 同時,Android會為每個應用程序分配一個單獨的LINUX用戶。Android會盡量保留一個正在運行進程,只在內存資源出現不足時,Android會嘗試停止一些進程從而釋放足夠的資源給其他新的進程使用, 也能保證用戶正在訪問的當前進程有足夠的資源去及時地響應用戶的事件。
我們可以將一些組件運行在其他進程中,並且可以為任意的進程添加線程。組件運行在哪個進程中是在manifest文件里設置的,其中<Activity>,<Service>,<receiver>和<provider>都有一個process屬性來指定該組件運行在哪個進程之中。我們可以設置這個屬性,使得每個組件運行在它們自己的進程中,或是幾個組件共同享用一個進程,或是不共同享用。<application>元素也有一個process屬性,用來指定所有的組件的默認屬性。
Android中的所有組件都在指定的進程中的主線程中實例化的,對組件的系統調用也是由主線程發出的。每個實例不會建立新的線程。對系統調用進行響應的方法——例如負責執行用戶動作的View.onKeyDown()和組件的生命周期函數——都是運行在這個主線程中的。這意味著當系統調用這個組件時,這個組件不能長時間的阻塞主線程。例如進行網路操作時或是更新UI時,如果運行時間較長,就不能直接在主線程中運行,因為這樣會阻塞這個進程中其他的組件,我們可以將這樣的組件分配到新建的線程中或是其他的線程中運行。
Android會根據進程中運行的組件類別以及組件的狀態來判斷該進程的重要性,Android會首先停止那些不重要的進程。按照重要性從高到低一共有五個級別:
1.1前台進程
前台進程是用戶當前正在使用的進程。只有一些前台進程可以在任何時候都存在。他們是最後一個被結束的,當內存低到根本連他們都不能運行的時候。一般來說, 在這種情況下,設備會進行內存調度,中止一些前台進程來保持對用戶交互的響應。
1.2可見進程
可見進程不包含前台的組件但是會在屏幕上顯示一個可見的進程是的重要程度很高,除非前台進程需要獲取它的資源,不然不會被中止。
1.3服務進程
運行著一個通過startService() 方法啟動的service,這個service不屬於上面提到的2種更高重要性的。service所在的進程雖然對用戶不是直接可見的,但是他們執行了用戶非常關注的任務(比如播放mp3,從網路下載數據)。只要前台進程和可見進程有足夠的內存,系統不會回收他們。
1.4後台進程
運行著一個對用戶不可見的activity(調用過 onStop() 方法).這些進程對用戶體驗沒有直接的影響,可以在服務進程、可見進程、前台進 程需要內存的時候回收。通常,系統中會有很多不可見進程在運行,他們被保存在LRU (least recently used) 列表中,以便內存不足的時候被第一時間回收。如果一個activity正 確的執行了它的生命周期,關閉這個進程對於用戶體驗沒有太大的影響。
1.5空進程
未運行任何程序組件。運行這些進程的唯一原因是作為一個緩存,縮短下次程序需要重新使用的啟動時間。系統經常中止這些進程,這樣可以調節程序緩存和系統緩存的平衡。
單線程模型
線程在代碼是使用標準的java Thread對象來建立,那麼在Android系統中提供了一系列方便的類來管理線程——Looper用來在一個線程中執行消息循環,Handler用來處理消息,HandlerThread創建帶有消息循環的線程。具體可以看下面的詳細介紹。
當一個程序第一次啟動時,Android會同時啟動一個對應的主線程(Main Thread),主線程主要負責處理與UI相關的事件,如用戶的按鍵事件,用戶接觸屏幕的事件以及屏幕繪圖事件,並把相關的事件分發到對應的組件進行處理。所以主線程通常又被叫做UI線程。
在開發Android應用時必須遵守單線程模型的原則: Android UI操作並不是線程安全的並且這些操作必須在UI線程中執行。
2.1 子線程更新UI Android的UI是單線程(Single-threaded)的。
為了避免拖住GUI,一些較費時的對象應該交給獨立的線程去執行。如果幕後的線程來執行UI對象,Android就會發出錯誤訊息 。以後遇到這樣的異常拋出時就要知道怎麼回事了!
2.2 Message Queue
在單線程模型下,為了解決類似的問題,Android設計了一個Message Queue(消息隊列), 線程間可以通過該Message Queue並結合Handler和Looper組件進行信息交換。下面將對它們進行分別介紹:
2..3 Message 消息
理解為線程間交流的信息,處理數據後台線程需要更新UI,則發送Message內含一些數據給UI線程。
2.4. Handler 處理者
是Message的主要處理者,負責Message的發送,Message內容的執行處理。後台線程就是通過傳進來的Handler對象引用來sendMessage(Message)。而使用Handler,需要implement 該類的 handleMessage(Message) 方法,它是處理這些Message的操作內容,例如Update UI。通常需要子類化Handler來實現handleMessage方法。
2.5. Message Queue 消息隊列
用來存放通過Handler發布的消息,按照先進先出執行。 每個message queue都會有一個對應的Handler。Handler會向message queue通過兩種方法發送消息:sendMessage或post。這兩種消息都會插在message queue隊尾並按先進先出執行。但通過這兩種方法發送的消息執行的方式略有不同:通過sendMessage發送的是一個message對象,會被Handler的handleMessage()函數處理;而通過post方法發送的是一個runnable對象,則會自己執行。
2.6 Looper Looper是每條線程里的Message Queue的管家。
Android沒有Global的Message Queue,而Android會自動替主線程(UI線程)建立Message Queue,但在子線程里並沒有建立Message Queue。所以調用Looper.getMainLooper()得到的主線程的Looper不為NULL,但調用Looper.myLooper()得到當前線程的Looper就有可能為NULL。
從以上幾點,不難看出Android進程和線程的二者的區別所在。
㈥ Android主線程到底是什麼
Android中關於主線程的理解:
Android的主線程是UI線程,在Android中,四大組件運行在主線程中,在主線程中做耗時操作會導致程序出現卡頓甚至出現ANR異常,一個基本常識就是將耗時操作放到子線程中去處理,然後通過Handler回調到主線程。
有三點還需要注意:
因為四大組件運行在一個主線程中,那麼若果當前界面在顯示的時候,後台的activity仍有處理邏輯再運行的話,仍然會造成當前界面的卡頓。
通過Handler回調到主線程只是避免程序出現ANR的第一步,必須要注意handler中邏輯處理的耗時,如果將很多消息都扔給了handler,那麼也會給主線程造成壓力,導致程序運行卡頓。
四大組件、Handler都是在一個線程中,那麼主線程在同一時刻不可能發送兩個廣播,換句話說就是若果能夠保證所有的廣播都是在主線程中發送,那麼廣播內部其實不需要加上對非同步操作的處理。
㈦ Android:如何判斷當前進程是不是主線程
使用Looper判斷,方法為: Looper.myLooper() != Looper.getMainLooper()
使用線程句柄判斷,將主線程的Thread.currentThread()獲取到主線程當前句柄,保存起來,在需要判斷的時候調用Thread.currentThread()來與之比較,即可判斷當前線程是否是主線程了。
㈧ 隨筆之如何判斷Android應用進程是否為單線程及閑扯多核並行編程
我最早接觸多核知識是2008年末到2009年初。背景很簡單,我是做高性能網路數據傳輸伺服器的,類似FTPServer一樣。伺服器的吞吐能力最好是隨著CPU核數的增加成倍增長.。根據多核並行的知識,這是最理想的情況(有一個公式,可以計算性能和CPU核數的關系),但應用內部各個線程並非完全獨立。即線程是獨立運行在不同CPU核上,但是線程中所乾的事情卻在邏輯上有關系。例如運行在線程A上的函數等待運行在線程B上另外一個函數的執行結果。這樣就導致性能不是隨CPU核數線性增長。 根據上面的介紹,對於多核並行編程來說,最最重要的事情就是將你的應用中那些混淆不清的邏輯關系能拆成互不幹擾或者互相牽連較少的模塊,並讓他們在不同線程上運行。這樣就真正發揮多核的優勢了。 1 對於純邏輯關系的問題,也就是非計算方面(即矩陣計算,編解碼等),要想能掰叱清楚。難度很大。七大姑,八大姨的,能分那麼清楚嗎?目前,這方面的資料較少。 2 對於純計算方面的問題,例如矩陣計算,要研究的就不是編碼,而是數學,要把計算拆成各個小塊,每個小塊可單獨運行在獨立線程上,然後再匯總計算結果。這方面資料較多,如周偉明的《多核計算與程序設計》。編程角度看,OpenMP是一個多核並行計算的好庫。(有人能嘗試下用OpenMP來拆分邏輯工作嗎?) 好了。多核的故事閑扯到這,對於純邏輯關系問題,再扯的話就會扯到線程池,並發編程,非同步IO,驚群效應,分布式內存管理等等等等。 下面來看如何判斷Android應用進程為單線程還是多線程?請先思考,再看下面的答案:1android應用是運行在android環境中的,簡單來說,是運行在dalvik虛擬機之上,而dalvik虛擬機本身是會創建一些線程,例如垃圾回收線程,JDWP調試線程2Android應用會經常利用binder和系統服務進行IPC通信,根據binder本身的特性,它會動態創建線程來完成外界請求。 以上兩類線程都是應用不可控的,保守估計,這類不可控線程至少在3個左右3除了主線程之外的,就是應用自己是否會創建線程了。 查看一個進程中線程的方法有: ps,加一些參數(具體忘記了),可看某個進程下的線程及線程號,但無法區別是系統創建的線程還是應用自己創建的線程 kill -3 對應進程pid,這個方法會向進程發送SIGQUIT消息,dalvik虛擬機會跟蹤這個信號,並列印該進程所有線程的堆棧到一個文件 native代碼(如Jni庫)如果直接調用posix創建線程,則上述方法無法跟蹤(如果該線程能回調到Java層,也可以獲取信息),只能根據ps得到的信息,減去SIGQUIT得到的信息來判斷了。不過這類線程一般都是應用自己創建的。