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сохта шудааст, фиристода ва коркард кунад. Одатан,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)
}
}
}