Ինչպես իրականացնել ասինխրոնային գործողություններ մաքուր Android-ում։
sobes.tech AI
Պատասխան AI-ից
Կան մի քանի եղանակներ.
-
Ցանցեր (Threads): Ստեղծում և կառավարում սեփական ցանցերը:
new Thread(new Runnable() { @Override public void run() { // Կատարել երկարատև օպերացիա // ... // Թարմացնել UI (պահանջում է Handler) // handler.post(...) } }).start(); -
Handler և Looper: Օգտագործվում են հաղորդագրությունների փոխանակման համար ցանցերի միջև, հաճախ ֆոնային ցանցից UI թարմացնելու համար:
Handler handler = new Handler(Looper.getMainLooper()); // ... ֆոնային ցանցում handler.post(new Runnable() { @Override public void run() { // Թարմացնել UI } }); -
AsyncTask (հնացած, բայց օգտակար գիտելիք): Պարզ միջոց՝ իրականացնել ասինխրոնային առաջադրանքներ և թարմացնել UI: Առաջարկված չէ նոր կոդի համար.
private class MyAsyncTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { // Կատարել երկարատև օպերացիա return "Արդյունք"; } @Override protected void onPostExecute(String result) { // Թարմացնել UI արդյունքով } } // ... // new MyAsyncTask().execute(); -
ExecutorService և Future: Ավելի ճկուն մեխանիզմ՝ կառավարման պուլերով:
ExecutorService executor = Executors.newSingleThreadExecutor(); Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { // Կատարել երկարատև օպերացիա return "Արդյունք"; } }); // Արդյունքի ստացում (բլոկավորող) // String result = future.get(); -
Kotlin Coroutines: Ժամանակակից մոտեցում՝ асинхрон ծրագրավորման համար Kotlin-ում, հիմնված համատեղ ծրագրերի վրա:
import kotlinx.coroutines.* // ... կորյուտայի շրջանակում (օրինակ, viewModelScope) GlobalScope.launch(Dispatchers.IO) { // Կատարում ֆոնային IO հոսքում // Կատարել երկարատև օպերացիա withContext(Dispatchers.Main) { // Փոխել գլխավոր հոսք՝ UI թարմացման համար // Թարմացնել UI } }
Ընտրությունը կախված է առաջադրանքի բարդությունից, անհրաժեշտ վերահսկողության մակարդակից և լեզվի նախընտրությունից (Java/Kotlin): Արդիական Android ծրագրավորման մեջ խորհուրդ է տրվում օգտագործել Kotlin Coroutines կամ այլ գրադարաններ՝ որպես RxJava կամ Flow։