рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХреЛрд░рд╛рдЯрд┐рди рдкреИрдЯрд░реНрди рдФрд░ рдПрдВрдЯреАрдкреИрдЯрд░реНрди

рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХреЛрд░рд╛рдЯрд┐рди рдкреИрдЯрд░реНрди рдФрд░ рдПрдВрдЯреАрдкреИрдЯрд░реНрди


рдореИрдВрдиреЗ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХреЛрдЯрд▓рд┐рди рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


CoroutineScope рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓ рд▓рдкреЗрдЯреЗрдВ рдпрд╛ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП SupervisorJob рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж async рдмреНрд▓реЙрдХ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ try/catch рдкрд░ рднрд░реЛрд╕рд╛ рди try/catch ред


 val job: Job = Job() val scope = CoroutineScope(Dispatchers.Default + job) // may throw Exception fun doWork(): Deferred<String> = scope.async { ... } // (1) fun loadData() = scope.launch { try { doWork().await() // (2) } catch (e: Exception) { ... } } 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, doWork рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдпрд╛ coroutine (1) рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ doWork рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ try/catch (2) try/catch рд╕рд╛рде doWork рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА try/catch , рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрднреА рднреА рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдиреМрдХрд░реА рдХреЗ рдХрд┐рд╕реА рднреА рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рддрддреНрдХрд╛рд▓ рд╡рд┐рдлрд▓рддрд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред


рддреНрд░реБрдЯрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ SupervisorJob (1) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред


рдмрд╛рд▓ рдШрдЯрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╡рд┐рдлрд▓рддрд╛ рдпрд╛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

 val job = SupervisorJob() // (1) val scope = CoroutineScope(Dispatchers.Default + job) // may throw Exception fun doWork(): Deferred<String> = scope.async { ... } fun loadData() = scope.launch { try { doWork().await() } catch (e: Exception) { ... } } 

рдиреЛрдЯ : рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдк SupervisorJob рд╕рд╛рде рдЕрдкрдиреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрд░рдЯрд╛рдЗрди рдХреЙрд▓ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЕрднреА рднреА рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреНрд░реИрд╢ рдХрд░ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ async рдореВрд▓ рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрди (1) рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред


 val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) fun loadData() = scope.launch { try { async { // (1) // may throw Exception }.await() } catch (e: Exception) { ... } } 

рджреБрд░реНрдШрдЯрдирд╛ рд╕реЗ рдмрдЪрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛, рдЬреЛ рдЕрдзрд┐рдХ рдмреЗрд╣рддрд░ рд╣реИ, coroutineScope (1) рдореЗрдВ coroutineScope рд▓рдкреЗрдЯрдирд╛ рд╣реИред рдЕрдм, рдЬрдм рдХреЛрдИ рдЕрдкрд╡рд╛рдж async рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд╛рд╣рд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд┐рдП рдмрд┐рдирд╛, рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдмрдирд╛рдП рдЧрдП рдЕрдиреНрдп рд╕рднреА рдХреЛрд░рдЖрдЙрдЯ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИред (2)


 val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) // may throw Exception fun doWork(): Deferred<String> = coroutineScope { // (1) async { ... } } fun loadData() = scope.launch { // (2) try { doWork().await() } catch (e: Exception) { ... } } 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк async рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред


рд░реВрдЯ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреНрд░рдмрдВрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдкрдиреА рд░реВрдЯ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдЕрдВрджрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╡рд░реНрдХ рдХрд░рдиреЗ рдФрд░ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдореБрдЦреНрдп рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░реЗрдВред


 val scope = CoroutineScope(Dispatchers.Default) // (1) fun login() = scope.launch { withContext(Dispatcher.Main) { view.showLoading() } // (2) networkClient.login(...) withContext(Dispatcher.Main) { view.hideLoading() } // (2) } 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо CoroutineScope (1) рдореЗрдВ CoroutineScope рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реВрдЯ рдХреЛрд░рдЖрдЙрдЯ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рдВрджрд░реНрдн (2) рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред


рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдореБрдЦреНрдп рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд CoroutineScope рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдФрд░ рдХрдо рд╕реНрдкрд╖реНрдЯ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред


 val scope = CoroutineScope(Dispatchers.Main) fun login() = scope.launch { view.showLoading() withContext(Dispatcher.IO) { networkClient.login(...) } view.hideLoading() } 

рдЕрдирд╛рд╡рд╢реНрдпрдХ рдПрд╕рд┐рдВрдХреНрд╕ / рд╡реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ


рдпрджрд┐ рдЖрдк async рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд await , рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


 launch { val data = async(Dispatchers.Default) { /* code */ }.await() } 

рдпрджрд┐ рдЖрдк withContext рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ withContext рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП withContext рд╕рдмрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИред


 launch { val data = withContext(Dispatchers.Default) { /* code */ } } 

рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдЗрддрдиреА рдмрдбрд╝реА рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ async рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ coroutine рдмрдирд╛рддрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╢рдмреНрджрд╛рд░реНрде async рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдЖрдк рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХрдИ coroutines рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдЙрдирдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред


рдиреМрдХрд░реА рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ


рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрд░рдЖрдЙрдЯ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдиреМрдХрд░реА рд░рджреНрдж рди рдХрд░реЗрдВред


 class WorkManager { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) fun doWork1() { scope.launch { /* do work */ } } fun doWork2() { scope.launch { /* do work */ } } fun cancelAllWork() { job.cancel() } } fun main() { val workManager = WorkManager() workManager.doWork1() workManager.doWork2() workManager.cancelAllWork() workManager.doWork1() // (1) } 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдиреМрдХрд░реА рдХреЛ рд░рджреНрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦ рджреЗрддреЗ рд╣реИрдВред рдкреВрд░реНрдг рдХреА рдЧрдИ рдиреМрдХрд░реА рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдХреЛрд░рдЖрдЙрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (1)ред


рдпрджрд┐ рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рднреА cancelChildren рдХреЛ рдкреВрд░реНрд╡рд╡рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк cancelChildren рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдиреМрдХрд░рд┐рдпреЛрдВ (2) рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред


 class WorkManager { val job = SupervisorJob() val scope = CoroutineScope(Dispatchers.Default + job) fun doWork1(): Job = scope.launch { /* do work */ } // (2) fun doWork2(): Job = scope.launch { /* do work */ } // (2) fun cancelAllWork() { scope.coroutineContext.cancelChildren() // (1) } } fun main() { val workManager = WorkManager() workManager.doWork1() workManager.doWork2() workManager.cancelAllWork() workManager.doWork1() } 

рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЙрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪреЗрдВ


suspend рдлрд╝рдВрдХреНрд╢рди рди рд▓рд┐рдЦреЗрдВ, рдЬрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреЛрд░рдЖрдЙрдЯ рдкреНрд░рдмрдВрдзрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ред


 suspend fun login(): Result { view.showLoading() val result = withContext(Dispatcher.IO) { someBlockingCall() } view.hideLoading() return result } 

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓реЙрдЧрд┐рди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд▓рдВрдмрди рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдФрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдХреЛрд░рдЖрдЙрдЯ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореБрдЦреНрдп рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


 launch(Dispatcher.Main) { // (1)    val loginResult = login() ... } launch(Dispatcher.Default) { // (2)   val loginResult = login() ... } 

CalledFromWrongThreadException: рдХреЗрд╡рд▓ рд╕реНрд░реЛрдд рдереНрд░реЗрдб рдЬрд┐рд╕рдиреЗ рд╡реНрдпреВ рдШрдЯрдХреЛрдВ рдХрд╛ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдпрд╛ рдерд╛, рд╡реЗ рдЙрди рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдкрдирд╛ рдирд┐рд▓рдВрдмрди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдХреЛрд░рдЖрдЙрдЯ рдкреНрд░рдмрдВрдзрдХ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред


 suspend fun login(): Result = withContext(Dispatcher.Main) { view.showLoading() val result = withContext(Dispatcher.IO) { someBlockingCall() } view.hideLoading() return result } 

рдЕрдм рд╣рдо рдХрд┐рд╕реА рднреА рдбрд┐рд╕реНрдкреИрдЪрд░ рд╕реЗ рдЕрдкрдиреЗ рд▓реЙрдЧрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 launch(Dispatcher.Main) { // (1) no crash val loginResult = login() ... } launch(Dispatcher.Default) { // (2) no crash ether val loginResult = login() ... } 

рд╡реИрд╢реНрд╡рд┐рдХ рджрд╛рдпрд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ


рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ GlobalScope рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


 GlobalScope.launch { // code } 

рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрд╡реЗрджрди рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд░рджреНрдж рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди- рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЙрд░рдЯрд╛рдЗрдирд╕реНрд╕реНрдХреЛрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЧреНрд▓реЛрдмрд▓рд╕реНрдХреИрдк рдореЗрдВ рдПрд╕рд┐рдХреНрд╕ рдпрд╛ рд▓реЙрдиреНрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрддреНрдпрдзрд┐рдХ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ, рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдПрдХ рдЧрддрд┐рд╡рд┐рдзрд┐, рдлреНрд░реИрдЧрдореЗрдВрдЯ, рд╡реНрдпреВ рдпрд╛ рд╡реНрдпреВрдореЙрдбрд▓ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рддрдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


 class MainActivity : AppCompatActivity(), CoroutineScope { private val job = SupervisorJob() override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job override fun onDestroy() { super.onDestroy() coroutineContext.cancelChildren() } fun loadData() = launch { // code } } 

Source: https://habr.com/ru/post/hi432942/


All Articles