Ինչպես սկսել ասինխրոն գործողությունները մաքուր Android-ում?
sobes.tech AI
Պատասխան AI-ից
Կա մի քանի եղանակներ՝
-
Thread: Ստեղծել նոր հոսք՝ առաջադրանքը կատարելու համար: Պարզ, բայց կյանքի ցիկլի կառավարման և տվյալների փոխանցման համար գլխավոր հոսքին պահանջվում է լրացուցիչ լոգիկա (Handler,runOnUiThread):new Thread(new Runnable() { @Override public void run() { // Ասինխրոն գործողության կատարմամբ // UI թարմացում `runOnUiThread` կամ `Handler`-ի միջոցով } }).start(); -
AsyncTask: Հին, բայց պարզ դաս՝ ֆոնային գործողություններ կատարելու և UI-ն թարմացնելու համար: Պարունակում էonPreExecute,doInBackground,onProgressUpdate,onPostExecuteմեթոդներ:private static class MyAsyncTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { // Ասինխրոն գործողության կատարում return "Արդյունք"; } @Override protected void onPostExecute(String result) { // UI թարմացում գլխավոր հոսքում } } // Սկսում: new MyAsyncTask().execute(); -
HandlerևLooper: Ավելի ճկուն մեխանիզմ հաղորդագրությունների և առաջադրանքների ուղարկման և մշակման համար հոսքերի միջև:Handler-ը կապված էLooper-ի հետ, որի մեջ է ստեղծված:Handler handler = new Handler(Looper.getMainLooper()); // Գլխավոր հոսքի համար handler.post(new Runnable() { @Override public void run() { // Գլխավոր հոսքում առաջադրանքի կատարմամբ՝ ասինխրոն գործողությունից հետո } }); -
ExecutorServiceևCallable/Runnable: Ստանդարտ մեխանիզմներ Java- ում՝ հոսքերի պուլը կառավարելու համար: Արդյունավետ օգտագործում են ռեսուրսները և կառավարում բազմաթիվ առաջադրանքների կատարմամբ:ExecutorService executor = Executors.newSingleThreadExecutor(); // կամ այլ տեսակ executor.submit(new Runnable() { @Override public void run() { // Ասինխրոն գործողության կատարում } }); // կամ submit(Callable)՝ արդյունք ստանալու համար -
Coroutine(Kotlin-ով): Ավելի ժամանակակից և հարմար միջոց՝ ասինխրոն գործողությունները կառավարելու համար Kotlin- ում: Позволяют писать асинхронный код в императивном стиле. Պահանջվում է համապատասխան կախվածությունների ավելացում:import kotlinx.coroutines.* GlobalScope.launch(Dispatchers.IO) { // Ասինխրոն գործողության կատարում ֆոնային հոսքում withContext(Dispatchers.Main) { // UI թարմացում գլխավոր հոսքում } }