理論上CPU 處理程式都是順序執行的,100條程式碼,cpu 會逐條執行,遇到跳轉語句則停止當前的處理,然後轉去執行跳轉目標的程式碼,執行完後返回接著執行(當然事實上不是,因為有分支預測之類的技術)。如果遇到一些耗時操作,比如等待使用者輸入之類的,則 cpu 會停下,直到使用者完成輸入後,cpu 收到資料,才接著執行下去,這種現象稱為阻塞。
但有的時候,我們往往需要程式能非同步執行程式碼,即在效果上實現 cpu 能同時執行多個程式碼塊,比如,在等待使用者輸入的時候,還能放個音樂看個小黃書什麼的,為了實現這種非同步效果,作業系統為我們引入了程序這個概念。
程序本質上就是一個載入到記憶體的可執行程式,每當使用者啟動一個程式,程式碼就會被載入記憶體,稱為一個程序,使用者可以同時啟動多個程式,這樣就會有多個程序,程序是可以同時被 CPU 執行的,當一個程序的程式碼發生阻塞,作業系統會讓 cpu 自動轉去執行另外一個程序。而在一般情況下,作業系統則會按照程序不同的優先順序,讓 CPU在不同的程序間來回切換執行。
有了程序後人們發現,在很多情況下,光有程序間的非同步執行還遠遠不夠,我們往往還需要可執行程式內也有非同步執行程式碼的功能,比如影片播放器程式,我在 cpu 全力從磁碟載入解碼渲染影片的時候,顯然不能阻塞使用者的輸入操作比如按停止鍵,在這種需求下,於是又有了執行緒這個概念,執行緒最早被稱為次級程序,也就是程序內的程序,後面不知道誰覺得這種說法有點2B,於是改為了執行緒。
執行緒出現後,每個可執行程式都會有一個主執行緒,也就是 main 方法所在的程式碼流程,然後開發人員可以透過呼叫系統介面開啟新的執行緒,多個執行緒在效果上是可以同時執行的,這樣,程式設計的方式就徹底改變了,比如前面提到的影片播放器程式,我可以在程式中開啟一個執行緒負責從磁碟載入解碼視屏,然後另開一個執行緒,負責將解碼的影片畫到螢幕上,然後再另開一個執行緒專門接收使用者輸入,然後這幾個執行緒是同時執行的,這樣就解決了上述的問題。
修正下,問題看錯了,前面回答成 ANR 了,應用已停止執行是執行的程式碼發生未捕獲異常退出了,這種通常會伴隨閃退,可以抓下日誌看看異常資訊即可~~
============下面是 ANR 彈框的解釋=================
這類錯誤一般稱為ANR(APP 無響應),原因是 UI 執行緒被阻塞,要理解這個首先要有執行緒的概念。
理論上CPU 處理程式都是順序執行的,100條程式碼,cpu 會逐條執行,遇到跳轉語句則停止當前的處理,然後轉去執行跳轉目標的程式碼,執行完後返回接著執行(當然事實上不是,因為有分支預測之類的技術)。如果遇到一些耗時操作,比如等待使用者輸入之類的,則 cpu 會停下,直到使用者完成輸入後,cpu 收到資料,才接著執行下去,這種現象稱為阻塞。
但有的時候,我們往往需要程式能非同步執行程式碼,即在效果上實現 cpu 能同時執行多個程式碼塊,比如,在等待使用者輸入的時候,還能放個音樂看個小黃書什麼的,為了實現這種非同步效果,作業系統為我們引入了程序這個概念。
程序本質上就是一個載入到記憶體的可執行程式,每當使用者啟動一個程式,程式碼就會被載入記憶體,稱為一個程序,使用者可以同時啟動多個程式,這樣就會有多個程序,程序是可以同時被 CPU 執行的,當一個程序的程式碼發生阻塞,作業系統會讓 cpu 自動轉去執行另外一個程序。而在一般情況下,作業系統則會按照程序不同的優先順序,讓 CPU在不同的程序間來回切換執行。
有了程序後人們發現,在很多情況下,光有程序間的非同步執行還遠遠不夠,我們往往還需要可執行程式內也有非同步執行程式碼的功能,比如影片播放器程式,我在 cpu 全力從磁碟載入解碼渲染影片的時候,顯然不能阻塞使用者的輸入操作比如按停止鍵,在這種需求下,於是又有了執行緒這個概念,執行緒最早被稱為次級程序,也就是程序內的程序,後面不知道誰覺得這種說法有點2B,於是改為了執行緒。
執行緒出現後,每個可執行程式都會有一個主執行緒,也就是 main 方法所在的程式碼流程,然後開發人員可以透過呼叫系統介面開啟新的執行緒,多個執行緒在效果上是可以同時執行的,這樣,程式設計的方式就徹底改變了,比如前面提到的影片播放器程式,我可以在程式中開啟一個執行緒負責從磁碟載入解碼視屏,然後另開一個執行緒,負責將解碼的影片畫到螢幕上,然後再另開一個執行緒專門接收使用者輸入,然後這幾個執行緒是同時執行的,這樣就解決了上述的問題。
好了,然後我們回過頭來看 ANR,每個安卓 APP 中都有一個 UI 執行緒,專門負責繪製介面,但有的時候,由於一些不良的程式碼習慣,往往會將一些阻塞性的操作寫到 UI 執行緒上,比如死迴圈,這樣就會導致 UI 執行緒被阻塞(手機。。。手機它卡住了,點了沒反應),安卓系統有個機制就是當 UI 執行緒被阻塞超過15秒(不同版本不一樣,大致這個時間),就會認定這個 APP 掛了,然後系統就會彈出 ANR 彈框告知使用者,這破 APP 沒響應了,關了吧,就是這麼回事。