前言
實踐是最好的學習方式,技術也如此。
文章目錄
- 前言
- 一、進程與線程
- 1、進程
- 2、線程
- 二、實現
- 三、異步任務加載器
一、進程與線程
1、進程
- 進程(Process)是操作系統分配資源的基本單位,它是一個執行中的程序實例;
- 每個進程都有自己獨立的內存空間,不同進程的內存是相互獨立的;
- 在Android系統中,每個應用都會以一個新的進程運行,系統會自動幫我們管理這些進程;
- 默認情況下,Android系統會為每個App分配一個進程。這個默認進程里可以包含多個Activity);
- 當在這個進程內啟動一個新的Activity時,是直接在該進程create一個Activity實例,不會創建新進程;
- 多個Activity會共享該應用進程的資源和內存空間;
- 單純啟動新Activity并不會造成進程切換,對系統資源影響較小
2、線程
* 線程就是讓==一個程序==有能力==同時完成多件事情==;
- 線程是正在運行的程序中的一條獨立的執行路徑;
- 主線程
- 當 Android 程序啟動時,系統會創建一個主線程,也稱為 UI 線程;
- UI 線程是應用程序與 Android UI 工具包中的組件交互的方式(在這個線程中可以更新UI,處理用戶輸入事件等。UI組件像Activity、View都是在UI線程中初始化和創建的。);
- UI線程負責處理用戶界面的創建、更新和響應用戶交互事件,確保應用的用戶界面保持流暢、響應迅速,并提供良好的用戶體驗
- UI 線程只能處理和界面相關的工作,比如繪制界面,處理點擊事件等,區分UI線程和工作線程,就是讓耗時操作不阻塞界面,以保證應用的流暢性和用戶體驗;
- 后臺(工作)線程是除主線程或 UI 線程之外的任何線程;
- AsyncTask:
- 來簡化這種需要后臺工作的場景;
- 可以把AsyncTask看成一個工人,我們在主線程中告訴它需要做什么工作,它會自己另開一個線程(后臺線程)去工作。工作完成后它再回到主線程,通過回調方法將結果返回給我們。這樣下來,我們的主線程(UI線程)就可以專注于更新界面,不會被阻塞。而AsyncTask也封裝了線程管理和線程間通信的復雜性,我們只需要告訴它做什么工作就可以了;
- AsyncTask 通過異步線程可以避免阻塞,回調機制又可以獲取結果;
二、實現
- 回調:至于回調的概念,它表示一種函數或方法,當特定事件發生時就會被執行。回調不會主動調用,而是在滿足條件時由別處調用以完成響應。在Android中,回調機制很常見,例如點擊事件的onClick()就是一個回調方法。
AsyncTask通過線程間的回調,很好地結合了后臺工作與UI更新,極大地方便了程序邏輯的管理。
- TextView、Button;
- 用戶單擊 Button 時,應用程序會休眠一段隨機時間,然后在喚醒時在 TextView 中顯示一條消息;
// 第一個泛型參數String: 表示異步任務輸入參數的類型:String
// 第二個泛型參數Integer: 表示后臺任務執行進度的類型:Integer
// 第三個泛型參數Bitmap: 表示異步任務最終返回結果的類型:// 知識點:<T>表示類型參數T,用于在定義Box類時傳入實際的類型
public class MyAsyncTask extends AsyncTask <String, Integer, Bitmap>{}
應用現在有一個在后臺執行工作的 AsyncTask 類,現在可以為“啟動任務”按鈕實現 onClick 方法來觸發后臺任務;
doInBackground():實現代碼以執行要在單獨線程上執行的工作
onPostExecute():在doInBackground()執行結束后,自動在UI線程被調用,并接收doInBackground()的返回值。函數參數就是從doInBackground()中返回的結果
三、異步任務加載器
EditText,Button,TextView
需求:用戶在 EditText 中輸入書名并點擊按鈕,查詢用戶正在查找的圖書的作者和書名,結果顯示在 TextView 中