Junior
Ինչպես է աշխատում հիմնական հոսքը Android-ում?
sobes.tech AI
Պատասխան AI-ից
Հիմնական հոսքը (Main Thread) Android-ում, որը նաև հայտնի է որպես UI Thread, միակ հոսքն է, որը՝
- Հաշվարկում է բոլոր օգտագործողի ինտերֆեյսի իրադարձությունները (կոճակների սեղմումներ, սքրոլներ):
- Դիզայնում է տարրերը էկրանին:
- Կատարում է կյանքի ցիկլի կոդը (Activity, Fragment):
Երբ ծրագիրը սկսվում է, Android-ը ստեղծում է գլխավոր հոսքը: Բոլոր օգտագործողի ինտերֆեյսի տարրերը ստեղծվում և թարմացվում են միայն այս հոսքում:
Հիմնական հասկացություններ՝
- Event Loop: Հիմնական հոսքը աշխատում է ցիկլում, մշտապես հանում է հաղորդագրություններ (UI իրադարձություններ, նկարազարդման առաջադրանքներ)
MessageQueueհերթից և ուղարկում դրանք համապատասխան մշակողներին (Handler): - Looper:
Looperօբյեկտը կապված է հոսքի հետ և կառավարում է այս հաղորդագրությունների մշակման ցիկլը: - Handler:
Handlerօբյեկտը թույլ է տալիս ուղարկել և մշակելMessageևRunnableօբյեկտները կապվածMessageQueueհոսքում, որտեղ այն ստեղծվել է: ՀաճախHandler-ը ստեղծվում է գլխավոր հոսքում՝ UI-ի հետ փոխազդելու համար այլ հոսքերից:
Խնդիրներ՝
- ANR (Application Not Responding): Եթե երկարատև գործողություն կատարվում է հիմնական հոսքում, այն բլոկվում է, չի մշակվում UI իրադարձությունները և չի նկարազարդում էկրանը: Սա հանգեցնում է ծրագրի կախվածության և ANR-դիալոգի: Տիպիկ տևողությունը, որը հանգեցնում է ANR-ի գլխավոր հոսքում UI-ի հետ աշխատելիս, — 5 վայրկյան:
Որոշումներ՝
- Երկարատև գործողությունները (ներգծանցային հարցումներ, տվյալների բազայի աշխատանք, բարդ հաշվարկներ) կատարել ֆոնային հոսքերում:
- Օգտագործել միջհոսքային փոխազդեցության մեխանիզմներ UI- ի թարմացման համար ֆոնային հոսքերում (օրինակ,
Handler,AsyncTask,Coroutines):
// Օրինակ `Handler`-ի օգտագործում UI- ի թարմացման համար ֆոնային հոսքից
Handler mainHandler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
// Դլատև գործողության կատարում ֆոնային հոսքում
// ...
// UI թարմացման առաջադրանքի ուղարկում գլխավոր հոսք
mainHandler.post(new Runnable() {
@Override
public void run() {
// UI թարմացում գլխավոր հոսքում
// ...
}
});
}
}).start();
// Կորուտինների օգտագործման օրինակ UI թարմացման համար ֆոնային հոսքից
import kotlinx.coroutines.*
fun fetchDataAndUpdateUI() {
CoroutineScope(Dispatchers.IO).launch {
// Դլատև գործողության կատարում ֆոնային հոսքում
val data = fetchDataFromServer()
// Կտտանցում գլխավոր հոսք UI- ի համար
withContext(Dispatchers.Main) {
updateUI(data)
}
}
}