рднреЛрдЬрди рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рд░рд╛рдд рдореЗрдВ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕реЛрдПрдВ

Coroutines рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рд╡реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрд░ рдХреЗ рдмрд┐рдирд╛, рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрд╢рдВрдХрд╛рдПрдВ рд╣реИрдВ рдФрд░ рд╡реЗ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВред

рдПрдкреНрд╕рдХреЙрдиреНрдлрд╝ рдкрд░ рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдЗрд╡рд╛рдиреЛрд╡ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рд╢реИрддрд╛рди рдЗрддрдирд╛ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдк рдЕрднреА рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



рд╕реНрдкреАрдХрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ : рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдЗрд╡рд╛рдиреЛрд╡ ( dzigoro ) 7 рд╕рд╛рд▓ рдХреЗ рдЕрдиреБрднрд╡ рдХреЗ рд╕рд╛рде EPAM рдореЗрдВ рдПрдХ рдкреНрд░рдореБрдЦ рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░ рд╣реИ, рд╕реЙрд▓реНрдпреВрд╢рди рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдФрд░ iOS рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд╛ рд╢реМрдХреАрди рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдкрд╛рд╕ Google рдХреНрд▓рд╛рдЙрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рднреА рд╣реИред

рдЖрдк рдЬреЛ рднреА рдкрдврд╝рддреЗ рд╣реИрдВ рд╡рд╣ рдЕрдиреБрднрд╡ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЕрдзреНрдпрдпрдиреЛрдВ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХрд╛ рдПрдХ рдЙрддреНрдкрд╛рдж рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд╛рд░рдВрдЯреА рдХреЗ рд▓реЗрдВред

рдХреЛрд░рд╛рдЯрд╛рдЗрди, рдХреЛрдЯрд▓рд┐рди рдФрд░ рдЖрд░рдПрдХреНрд╕рдЬрд╛рд╡


рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП: рдХреЛрд░рдЯрд┐рди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╣реИ, рдмрд╛рдПрдБ рдмреАрдЯрд╛ред рдХреЛрдЯрд▓рд┐рди 1.3 рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рд╕реНрдерд┐рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╢рд╛рдВрддрд┐ рд╣реИред



рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдПрдХ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд┐рдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдЧ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рдереЗ:

  • рднреЛрдЬрди рдореЗрдВ 13% coroutinesред рд╕рдм рдареАрдХ рд╣реИ;
  • 25% рдЙрдиреНрд╣реЗрдВ рдкрд╛рд▓рддреВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ;
  • 24% - рдХреЛрдЯрд▓рд┐рди рдХреНрдпрд╛ рд╣реИ?
  • 38% RxJava рдХрд╛ рдереЛрдХ рд╣рд░ рдЬрдЧрд╣ рд╣реИред

рдЖрдВрдХрдбрд╝реЗ рдЦреБрд╢ рдирд╣реАрдВ рд╣реИрдВред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ RxJava рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ, рдЬрд┐рдирдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд░реАрдЯреАрди рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред

рдЕрдкрдиреА рдкрд┐рдЫрд▓реА рд░рд┐рдкреЛрд░реНрдЯреЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдХрд┐ рдХреИрд╕реЗ RxJava рд╕реЗ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдХреЙрдЯрди рдХреЗ рд▓рд┐рдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдпрд╛рдж рдХрд░реВрдВрдЧрд╛ред

рд╣рдо рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ?


рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╣рдо RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:

interface ApiClientRx { fun login(auth: Authorization) : Single<GithubUser> fun getRepositories (reposUrl: String, auth: Authorization) : Single<List<GithubRepository>> } //RxJava 2 implementation 

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ GitHub рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдХрд░реЗрдВред
  2. GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдПрдХрд▓ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рдПрдЧрд╛: GitHubUser рдпрд╛ GitHubRepository рдХреА рд╕реВрдЪреАред

рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛрдб рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 private fun attemptLoginRx () { showProgress(true) compositeDisposable.add(apiClient.login(auth) .flatMap { user -> apiClient.getRepositories(user.repos_url, auth) } .map { list -> list.map { it.full_name } } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doFinally { showProgress(false) } .subscribe( { list -> showRepositories(this, list) }, { error -> Log.e("TAG", "Failed to show repos", error) } )) } 

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

RxJava рдХреЛрдб рдХрдард┐рдирд╛рдЗрдпрд╛рдБ:

  • рдЬрдЯрд┐рд▓рддрд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рджреЛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдХреЗ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдФрд░ UI рдкрд░ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИред
  • рдЕрдирдмрд╛рдЙрдВрдб рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рдиред рд╕реНрдЯреИрдХ рдХреЗ рдирд┐рд╢рд╛рди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред
  • рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рдЙрдкрдпреЛрдЧ ред RxJava рд╣реБрдб рдХреЗ рддрд╣рдд рдмрд╣реБрдд рд╕реА рд╡рд╕реНрддреБрдПрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдЖ рд╕рдХрддреА рд╣реИред

рд╕рдВрд╕реНрдХрд░рдг реж.реирем рддрдХ рдХреЗ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдХреЛрдб рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

0.26 рдкрд░, рдПрдкреАрдЖрдИ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЙрддреНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдХреЛрдИ рднреА рдЕрднреА рддрдХ рдареЗрд╕ рдореЗрдВ 0.26 рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рдлреА рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ ред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд┐рд╕реА рднреА рдПрдХрд▓ рдФрд░ рдЕрдиреНрдп рд╕рд╣рд╛рдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред рд╡реЗ рддреБрд░рдВрдд рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗ: рдЧреАрдерд╣рдмреНрдпреВрд╕рд░ рдФрд░ рдЧреАрдерд╣реВрдмрдкреНрд░реЛрд╕реЗрд░рд┐рдЯреНрд░реА рдХреА рдПрдХ рд╕реВрдЪреАред GitHubUser рдФрд░ GitHubRepository рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрд╢реЛрдзрдХ рдирд┐рд▓рдВрдмрд┐рдд рд╣реЛрдВрдЧреЗред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╕реНрдкреЗрдВрдб рд▓рдЧрднрдЧ рд╣рдореЗрдВ рдХрд┐рд╕реА рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:

 interface ApiClient { suspend fun login(auth: Authorization) : GithubUser suspend fun getRepositories (reposUrl: String, auth: Authorization) : List<GithubRepository> } //Base interface 

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

 private fun attemptLogin () { launch(UI) { val auth = BasicAuthorization(login, pass) try { showProgress(true) val userlnfo = async { apiClient.login(auth) }.await() val repoUrl = userlnfo.repos_url val list = async { apiClient.getRepositories(repoUrl, auth) }.await() showRepositories( this, list.map { it -> it.full_name } ) } catch (e: RuntimeException) { showToast("Oops!") } finally { showProgress(false) } } } 

- рдореБрдЦреНрдп рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реЛрддреА рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо рдХреЙрд░рдЯреАрди рдмрд┐рд▓реНрдбрд░ рдХреЛ рдПрд╕рд┐рдВрдХреНрд╕ рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдпреВрдЬрд╝рд░рд▓реЙрдиреНрдлреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ред
- рд╣рдо рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- рдПрдХ рдФрд░ async рдХреЙрд▓ рдФрд░ рдХреЙрд▓ рд╡реЗрдЯ рдХрд░реЗрдВред

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

рдХреЛрд░рдЯрд╛рдЗрди рдмреЗрд╣рддрд░ рдХреНрдпреЛрдВ рд╣реИрдВ?

  • рдЗрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рд╕реБрд╕рдВрдЧрдд рд╣реИред
  • рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди RxJava рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред
  • рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЙрдирд╕реЗ рдорд┐рд▓реЗрдВрдЧреЗред

рдкрдХреНрд╖ рдХреЗ рд▓рд┐рдП 2 рдХрджрдо


рдЖрдЗрдП рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреАрдЫреЗ рд╣рдЯреЗрдВ, рдХреБрдЫ рдмрд╛рддреЗрдВ рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдЕрднреА рднреА рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЪрд░рдг 1редConttext рдмрдирд╛рдо рд▓реЙрдиреНрдЪ / async рдХреЗ рд╕рд╛рде


рдХреЛрд░рдЯрд╛рдЗрди рдмрд┐рд▓реНрдбрд░ рдПрд╕рд┐рдВрдХреНрд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛ , рдХреЛрд░рдЯрд╛рдЗрди рдмрд┐рд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╣реИ ред

рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдпрд╛ async рдПрдХ рдирдпрд╛ Coroutine рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ, рдЬреЛ рд╣рдореЗрд╢рд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ Coroutine рд╕рдВрджрд░реНрдн рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреВрд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк рдмрд╕ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рдХрд╛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХреЙрд░рдЯреАрди рдмрд┐рд▓реНрдбрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рдмрд╕ рдореМрдЬреВрджрд╛ Coroutine рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ 2-3 рдЧреБрдирд╛ рддреЗрдЬ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕рд╡рд╛рд▓ рд╣реИред рдпрджрд┐ рд╕рдЯреАрдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдФрд░ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рд╕рд╡рд╛рд▓ рд╣реИ ред

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

рдЪрд░рдг 2. рд░рд┐рдлрд▓реЗрдХреНрдЯрд░рд┐рдВрдЧ


рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрдЯрд┐рд▓ RxJava рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдореИрдВ рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдЖрдпрд╛ рдерд╛:

 observable1.getSubject().zipWith(observable2.getSubject(), (t1, t2) -> { // side effects return true; }).doOnError { // handle errors } .zipWith(observable3.getSubject(), (t3, t4) -> { // side effects return true; }).doOnComplete { // gather data } .subscribe() 

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рдПрдХ рдЬрдЯрд┐рд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдереА, рдкреНрд░рддреНрдпреЗрдХ рдЬрд╝рд┐рдк рдореЗрдВ рдЬрд╝рд┐рдк рдФрд░ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕рдиреЗ рдЗрд╡реЗрдВрдЯ рдмрд╕ рдореЗрдВ рдХреБрдЫ рдФрд░ рднреЗрдЬрд╛ рдерд╛ред рдХрдо рд╕реЗ рдХрдо рдХрд╛рд░реНрдп рдХреЛ рдЗрд╡реЗрдВрдЯ рдмрд╕ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдерд╛ред рдореИрдВ рдПрдХ рджрд┐рди рдХреЗ рд▓рд┐рдП рдмреИрдард╛, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрдЪрд╛ рдирд╣реАрдВ рд╕рдХрд╛ред рд╕рд╣реА рдирд┐рд░реНрдгрдп рд╕рдм рдХреБрдЫ рдмрд╛рд╣рд░ рдлреЗрдВрдХрдиреЗ рдФрд░ 4 рдШрдВрдЯреЗ рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдкрд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ ред

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП рд╕рдорд╛рди рд╣реИ:

 try { val firstChunkJob = async { call1 } val secondChunkJob = async { call2 } val thirdChunkJob = async { call3 } return Result( firstChunkJob.await(), secondChunkJob.await(), thirdChunkJob.await()) } catch (e: Exception) { // handle errors } 

- рд╣рдо рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрд╕рд┐рдВрдХреНрд╕ рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рд╣реИред
- рд╣реЛ рдЧрдпрд╛!

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрдЯрд┐рд▓ рдЬрдВрдЬреАрд░реЗрдВ рд╣реИрдВ рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рд╣реИрдВ, рддреЛ рдмрд╕ рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреЗрдЬ рд╣реИред

рдХреНрдпрд╛ рдардЧреЛрдВ рдореЗрдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ?


рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╣рдо, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рдирдП рдХреЗ рдбрд░ рд╕реЗ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • рд╣рдо рдЬреАрд╡рди рдЪрдХреНрд░ , рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдЯреБрдХрдбрд╝реЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ?
  • рдХреЛрд░реБрдЯрд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рджреИрдирд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдиреБрднрд╡ рдирд╣реАрдВ рд╣реИред
  • рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдХрд░рдг рдирд╣реАрдВред рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ RxJava рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП RxFCM ред RxJava рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
  • рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рдЗрди рдЪрд╛рд░ рдЖрд╢рдВрдХрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд░рд╛рдд рдХреЛ рд╢рд╛рдВрддрд┐ рд╕реЗ рд╕реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдмрд┐рдВрджреБ рд╕реЗ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

1. рдЬреАрд╡рдирдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрди


  • Coroutines рдбрд┐рд╕реНрдкреЛрдЬреЗрдмрд▓ рдпрд╛ AsyncTask рдХреЗ рд░реВрдк рдореЗрдВ рд▓реАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдирд▓ рд╕реВрдЪрдХ рдЕрдкрд╡рд╛рдж рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП , рдХреЛрд░рдЖрдЙрдЯ рдХреЛ рд░реЛрдХрдирд╛ рд╣реЛрдЧрд╛ред

рдмрдВрдж


рдХреНрдпрд╛ рдЖрдк Thread.stop () рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ? рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдирд╣реАрдВред JDK 1.1 рдореЗрдВ, рд╡рд┐рдзрд┐ рддреБрд░рдВрдд рдЕрдкреНрд░рдЪрд▓рд┐рдд рдШреЛрд╖рд┐рдд рдХрд░ рджреА рдЧрдИ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЯреБрдХрдбрд╝рд╛ рд▓реЗрдирд╛ рдФрд░ рд░реЛрдХрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕реНрдореГрддрд┐ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдорд┐рд▓реЗрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП, рдереНрд░реЗрдб.рд╕реНрдЯреЙрдк () рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рдЖрдкрдХреЛ рд╕рд╣рдХрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд░рджреНрджреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рджреВрд╕рд░реА рддрд░рдл рдХреЛрдб рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдЗрд╕реЗ рд░рджреНрдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╣рдо RxJava рдХреЗ рд╕рд╛рде рд╕реНрдЯреЙрдк рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 private val compositeDisposable = CompositeDisposable() fun requestSmth() { compositeDisposable.add( apiClientRx.requestSomething() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> {}) } override fun onDestroy() { compositeDisposable.dispose() } 


RxJava рдореЗрдВ рд╣рдо рдХрдореНрдкреЛрдЬрд┐рдЯрдбрд┐рд╕реЛрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред

- рдЦрдВрдб рдореЗрдВ рдпрд╛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдореЗрдВ рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЪрд░ рдХрдВрдкреЛрдЬрд┐рдЯреЛрдкреНрд▓реЙрд░реА рдЬреЛрдбрд╝реЗрдВ, рдЬрд╣рд╛рдВ рд╣рдо RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
- onDestro y рдореЗрдВ Dispose рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╕рднреА рдЕрдкрд╡рд╛рдж рдЦреБрдж рд╕реЗ рджреВрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╕рд┐рджреНрдзрд╛рдВрдд:

 private val job: Job? = null fun requestSmth() { job = launch(UI) { val user = apiClient.requestSomething() тАж } } override fun onDestroy() { job?.cancel() } 

рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

рдЖрдорддреМрд░ рдкрд░, coroutine рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреА рдиреМрдХрд░реА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

- рд╣рдо рдЗрд╕ рдиреМрдХрд░реА рдХреЛ рдпрд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдХрдорд╛рдВрдб "рд▓реЙрдиреНрдЪ" рдХреЛ рдХреЛрд░рдЯрд╛рдЗрди рдмрд┐рд▓реНрдбрд░ рджреЗрдВ ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ, рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдЕрдЧрд░ рд╣рдо рдХреБрдЫ рдФрд░ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ "рд▓реЙрдиреНрдЪ" рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИред
- рдиреМрдХрд░реА рдпрд╛рдж рд╣реИ, рдФрд░ onDestroy рдореЗрдВ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ "рд░рджреНрдж" рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ? рдкреНрд░рддреНрдпреЗрдХ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЛ рдПрдХ рд╕рд╛рде рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреМрдХрд░рд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдРрд╕рд╛ рди рдХрд░реЗрдВред

рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ : рдХрдореНрдкреЛрдЬрд┐рдЯрдЬреЙрдм рдФрд░ рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓-рдЕрд╡реЗрдпрд░ рдЬреЙрдм ред

рдХрдореНрдкреЛрдЬрд┐рдЯрдЬреЙрдм рдХрдореНрдкреЛрдЬрд┐рдЯреЛрд╕реЙрдкреА рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ :

 private val job: CompositeJob = CompositeJob() fun requestSmth() { job.add(launch(UI) { val user = apiClient.requestSomething() ... }) } override fun onDestroy() { job.cancel() } 

- рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдХрд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
- рд╣рдо рд╕рднреА рдиреМрдХрд░реА рдХрдореНрдкреЛрдЬрд┐рдЯрдЬреЛрдм рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдХрдорд╛рдВрдб рджреЗрддреЗ рд╣реИрдВ: "job.cancel () рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП!" ред

рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ 4 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ:

 Class CompositeJob { private val map = hashMapOf<String, Job>() fun add(job: Job, key: String = job.hashCode().toString()) = map.put(key, job)?.cancel() fun cancel(key: String) = map[key]?.cancel() fun cancel() = map.forEach { _ ,u -> u.cancel() } } 


рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

- рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдирдХреНрд╢рд╛ ,
- рдЬреЛрдбрд╝реЗрдВ рд╡рд┐рдзрд┐, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдиреМрдХрд░реА рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ,
- рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреБрдВрдЬреА рдкреИрд░рд╛рдореАрдЯрд░ред

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

рд░рджреНрдж рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ: рд╣рдореЗрдВ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рд░рджреНрдж рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдкреВрд░рд╛ рдирдХреНрд╢рд╛ рд░рджреНрдж рдХрд░ рджреЗрддрд╛ рд╣реИред рд╕рднреА рдХреЛрдб рдЖрдзреЗ рдШрдВрдЯреЗ рдореЗрдВ рдЪрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдКрдкрд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓реЗрдВред

рдЬреАрд╡рдирдЪрдХреНрд░ рд╕реЗ рдЕрд╡рдЧрдд рдиреМрдХрд░реА


рдХреНрдпрд╛ рдЖрдкрдиреЗ Android Lifecycle , Lifecycle рдХреЗ рдорд╛рд▓рд┐рдХ рдпрд╛ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ ?


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

рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ:

 public class MyObserver implements LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void connectListener() { ... } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) public void disconnectListener() { тАж } } 

рдЖрдк рд╡рд┐рдзрд┐ рдкрд░ рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╕ coroutine рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 class AndroidJob(lifecycle: Lifecycle) : Job by Job(), LifecycleObserver { init { lifecycle.addObserver(this) } @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun destroy() { Log.d("AndroidJob", "Cancelling a coroutine") cancel() } } 

- рдЖрдк рдЖрдзрд╛рд░ рд╡рд░реНрдЧ AndroidJob рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
- рд╣рдо рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
- LifecycleObserver рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдиреМрдХрд░реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред

рд╣рдо рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ:

- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдСрдмреНрдЬрд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЗрдлрд╕рд╛рдЗрдХрд▓ рдХреЛ рдЬреЛрдбрд╝реЗрдВред
- ON_DESTROY рдпрд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрддреА рд╣реИред
- ON_DESTROY рдореЗрдВ рд░рджреНрдж рдХрд░реЗрдВред
- рдЕрдкрдиреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдПрдХ parentJob рдЬрд╛рдУ ред
- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЙрдп рдЬреЙрдм рдпрд╛ рдЕрдкрдиреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдЬреАрд╡рдирдЪрдХреНрд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВред
- рдЗрд╕ рдкреЗрд░реЗрдВрдЯрдЬреЛрдм рдХреЛ рдкреЗрд░реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВред

рд╕рдорд╛рдкреНрдд рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 private var parentJob = AndroidJob(lifecycle) fun do() { job = launch(UI, parent = parentJob) { // code } } 

рдЬрдм рдЖрдк рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдмрд╛рд▓ рдХреЛрд░рдЖрдЙрдЯ рд░рджреНрдж рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрдм рдЖрдкрдХреЛ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдХреБрдЫ рднреА рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕рдм рдХреБрдЫ рдЕрдкрдиреЗ рдЖрдк рд╣реЛрддрд╛ рд╣реИ, рдХреЛрдИ рдФрд░ рдирд╣реАрдВ ON_DESTROYред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рддрд╛-рдкрд┐рддрд╛ = parentJob рдкрд╛рд╕ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред

рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рд╕рд░рд▓ рд▓рд┐рдВрдЯ рдирд┐рдпрдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реЗрдЧрд╛: "рдУрд╣, рдЖрдк рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рднреВрд▓ рдЧрдП!"

рд╕реА   рдЬреАрд╡рдирдЪрдХреНрд░ рдкреНрд░рдмрдВрдзрди рдХреА рдЫрдВрдЯрдиреА рдХреАред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЙрдкрдХрд░рдг рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЖрд░рд╛рдо рд╕реЗ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдФрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?

2. рдЬрдЯрд┐рд▓ рдЙрдкрдпреЛрдЧ-рдорд╛рдорд▓реЗ


рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдФрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИрдВ:

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

рджреЛрд╣рд░рд╛рдирд╛


рдЬрдм рд╣рдордиреЗ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛, рддреЛ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рд░рд┐рдкреАрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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

рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рд░реНрдп рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:

 suspend fun <T> retryDeferredWithDelay( deferred: () -> Deferred<T>, tries: Int = 3, timeDelay: Long = 1000L ): T { for (i in 1..tries) { try { return deferred().await() } catch (e: Exception) { if (i < tries) delay(timeDelay) else throw e } } throw UnsupportedOperationException() } 


рдСрдкрд░реЗрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

- рд╡рд╣ рдбрд┐рдлрд░реНрдб рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
- рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ async рдкрд░ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- рдЖрд╕реНрдердЧрд┐рдд рдХреЗ рдмрдЬрд╛рдп , рдЖрдк рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдмреНрд▓реЙрдХ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдХрд┐рд╕реА рднреА рдирд┐рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдп рджреЛрдиреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
- рд▓реВрдк рдХреЗ рд▓рд┐рдП - рдЖрдк рдЕрдкрдиреЗ рдХреЛрд░рдЖрдЙрдЯ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛рдЙрдВрдЯрд░ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд▓рдВрдм рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдирд╣реАрдВред

рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдПрдХ рдШрд╛рддреАрдп рд╡рд┐рд▓рдВрдм рдбрд╛рд▓реЗрдВ рдпрд╛ рдПрдХ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд▓рдВрдм рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред

рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдЬрд╝рд┐рдк


рд╣рдо рднреА рдЕрдХреНрд╕рд░ рдЙрдирдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдлрд┐рд░ рд╕реЗ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ:

 suspend fun <T1, T2, R> zip( source1: Deferred<T1>, source2: Deferred<T2>, zipper: BiFunction<T1, T2, R>): R { return zipper.apply(sourcel.await(), source2.await()) } suspend fun <T1, T2, R> Deferred<T1>.zipWith( other: Deferred<T2>, zipper: BiFunction<T1, T2, R>): R { return zip(this, other, zipper) } 

- рдЬрд┐рдкрд░ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ Deferred рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред
- рдЖрд╕реНрдердЧрд┐рдд рдХреЗ рдмрдЬрд╛рдп, рдЖрдк рд╕рд╕реНрдкреЗрдВрдб рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдХреЛрд░рдЯрд╛рдЗрди рдмрд┐рд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЕрдкрдиреА рдЬрд░реВрд░рдд рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрддрд╛рдПрдВрдЧреЗред

рдпрд╣ рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдбрд░ рдХреЛ рджреВрд░ рдХрд░ рджрд┐рдпрд╛ред

рдХреИрд╢



рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ RxJava рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдХреИрд╢ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ? рд╣рдо RxCache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рдмрд╛рдИрдВ рдУрд░ рдЖрд░реЗрдЦ рдореЗрдВ: рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдпрдореЙрдбрд▓ ред рджрд╛рдИрдВ рдУрд░ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рд╣реИрдВ: рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ред

рдЕрдЧрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛рдП, рддреЛ рдХреИрд╢ рдбреЗрдЯрд╛ рдХрд╛ рджреВрд╕рд░рд╛ рд╕реНрд░реЛрдд рд╣реЛрдЧрд╛ред

рдХреИрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░:

  • рдиреЗрдЯрд╡рд░реНрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрд░реЛрдд ред
  • рдЗрди-рдореЗрдореЛрд░реА рдХреИрд╢ ред
  • рд╕рдорд╛рдкреНрддрд┐ рдкрд░ рдирд┐рд░рдВрддрд░ рдХреИрд╢ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХреИрд╢ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреБрдирд░рд╛рд░рдВрдн рд╣реЛрдиреЗ рд╕реЗ рдмрдЪ рдЬрд╛рдПред

рддреАрд╕рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рдЖрджрд┐рдо рдХреИрд╢ рд▓рд┐рдЦреЗрдВред рдХреЙрд░рдЯреАрди рдмрд┐рд▓реНрдбрд░ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдлрд┐рд░ рд╕реЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдЖрддрд╛ рд╣реИред

 launch(UI) { var data = withContext(dispatcher) { persistence.getData() } if (data == null) { data = withContext(dispatcher) { memory.getData() } if (data == null) { data = withContext(dispatcher) { network.getData() } memory.cache(url, data) persistence.cache(url, data) } } } 

- рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдХреЙрдирдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рдбреЗрдЯрд╛ рдЖ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
- рдпрджрд┐ рджреГрдврд╝рддрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдореЗрдореЛрд░реА.рдЪреИрдЪ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
- рдпрджрд┐ рдХреЛрдИ рдореИрдореЛрд░реА.рдЪреЗрдЪ рдирд╣реАрдВ рд╣реИ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрд░реЛрдд рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдмреЗрд╢рдХ, рд╕рднреА рдХреИрд╢ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред

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

Rx рдореЗрдВ RxCache рд╣реИ


рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрднреА рднреА RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдк RxCache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЕрднреА рднреА рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред RxCache рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдпрд╣ рдХрд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ 15 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛: "рдХреГрдкрдпрд╛, рдЗрд╕ рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рдж, рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рди рднреЗрдЬреЗрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рддрд╛рдЬрд╝рд╛ рдбреЗрдЯрд╛ рднреЗрдЬреЗрдВред"

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЕрджреНрднреБрдд рд╣реИ рдХрд┐ рдпрд╣ рдЯреАрдо рдХреЛ рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдШреЛрд╖рдгрд╛ рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдЖрдк рд░реЗрдЯреНрд░реЛрдлрд┐рдЯ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ:

 public interface FeatureConfigCacheProvider { @ProviderKey("features") @LifeCache(duration = 15, timeUnit = TimeUnit.MINUTES) fun getFeatures( result: Observable<Features>, cacheName: DynamicKey ): Observable<Reply<Features>> } 

- рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ CacheProvider рд╣реИ ред
- рдПрдХ рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдХрд╣реЗрдВ рдХрд┐ LifeCache рдЬреАрд╡рдирдХрд╛рд▓ 15 рдорд┐рдирдЯ рд╣реИред рдЬрд┐рд╕ рдХреБрдВрдЬреА рдХреЗ рджреНрд╡рд╛рд░рд╛ рдпрд╣ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ рд╡рд╣ рд╣реИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ ред
- рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЙрддреНрддрд░ рджреЗрдВ , рдЬрд╣рд╛рдВ рдЬрд╡рд╛рдм рдХреИрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡рд╕реНрддреБ рд╣реИред

рдЙрдкрдпреЛрдЧ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:

 val restObservable = configServiceRestApi.getFeatures() val features = featureConfigCacheProvider.getFeatures( restObservable, DynamicKey(CACHE_KEY) ) 

- Rx рдХреИрд╢ рд╕реЗ, RestApi рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред
- рдХреИрд╢реЗрдкреНрд░реЙрдЗрдбрд░ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ ред
- рдЙрд╕реЗ рдПрдХ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдЦрд┐рд▓рд╛рдПрдВред
- рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЦреБрдж рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ: рдХреИрд╢ рдкрд░ рдЬрд╛рдПрдВ рдпрд╛ рдирд╣реАрдВ, рдЕрдЧрд░ рд╕рдордп рдЦрддреНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреА рдУрд░ рдореБрдбрд╝реЗрдВ рдФрд░ рджреВрд╕рд░рд╛ рдСрдкрд░реЗрд╢рди рдХрд░реЗрдВред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдореИрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдХреЛрд░рд╛рдЯрд╛рдЗрди рдХреИрд╢


EPAM рдХреЗ рдЕрдВрджрд░, рд╣рдо Coroutine Cache рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ RxCache рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░реЗрдЧреАред рд╣рдордиреЗ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрд╛ рдФрд░ рдЗрд╕реЗ рдХрдВрдкрдиреА рдХреЗ рдЕрдВрджрд░ рдЪрд▓рд╛рдпрд╛ред рдЬреИрд╕реЗ рд╣реА рдкрд╣рд▓реА рд░рд┐рд▓реАрдЬ рд╣реЛрдЧреА, рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░рдХреЗ рдЦреБрд╢ рд░рд╣реВрдВрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 val restFunction = configServiceRestApi.getFeatures() val features = withCache(CACHE_KEY) { restFunction() } 

рд╣рдо рдПрдХ рдирд┐рд▓рдВрдмрди рд╕рдорд╛рд░реЛрд╣ getFeatures рд╣реЛрдЧрд╛ ред рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдЪреНрдЪ-рдХреНрд░рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рдХреИрд╢ рд╣реЛрдЧрд╛, рдЬреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рд╣рдо рдШреЛрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдПрдВрдЧреЗред

рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐




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

рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реИ - рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢-рдХреИрдЪ- рдПрдВрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИред

рдЙрддреНрдкрд╛рджрди рдореЗрдВ, рд╕рд╛рдзрд╛рд░рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирд┐рдореНрди рд╣реИрдВ:

- рдиреЗрд╕реНрдЯреЗрдб рдХреИрдЪ ,
- рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдкрд╡рд╛рдж ,
- рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдпрд╛ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ,
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реАред рдЙрд╕рдиреЗ рдлрд┐рд░ рдХреБрдЫ рдЧрд▓рдд рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕реЗ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рджреЛрд╖реА рдард╣рд░рд╛рдпрд╛ред

рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред

2 рд╕рдорд╛рдзрд╛рди рд╣реИрдВ: CoroutineExceptionHandler рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рджреГрд╖реНрдЯрд┐рдХреЛрдгред

Coroutine рдЕрдкрд╡рд╛рдж рд╣реИрдВрдбрд▓рд░


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

рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдЬрдЯрд┐рд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВ?

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

 val handler = CoroutineExceptionHandler(handler = { , error -> hideProgressDialog() val defaultErrorMsg = "Something went wrong" val errorMsg = when (error) { is ConnectionException -> userFriendlyErrorMessage(error, defaultErrorMsg) is HttpResponseException -> userFriendlyErrorMessage(Endpoint.EndpointType.ENDPOINT_SYNCPLICITY, error) is EncodingException -> "Failed to decode data, please try again" else -> defaultErrorMsg } Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show() }) 

- рдЪрд▓реЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: "рдХреБрдЫ рдЧрд▓рдд рд╣реЛ рдЧрдпрд╛!" рдФрд░ рдЕрдкрд╡рд╛рдж рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред
- рдпрджрд┐ рдпрд╣ рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╣реИ, рддреЛ рд╣рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдПрдХ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджреЗрд╢ рд▓реЗрддреЗ рд╣реИрдВ: тАЬрдпрд╛рд░, рд╡рд╛рдИ-рдлрд╛рдИ рдЪрд╛рд▓реВ рдХрд░реЛ рдФрд░ рддреБрдореНрд╣рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдПрдВ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдВрдЧреАред рдореИрдВ рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реВрдВред тАЭ
- рдЕрдЧрд░ рд╕рд░реНрд╡рд░ рдиреЗ рдХреБрдЫ рдЧрд▓рдд рдХрд╣рд╛ рд╣реИ , рддреЛ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдмрддрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ: "рд▓реЙрдЧ рдЖрдЙрдЯ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ", рдпрд╛ "рдореЙрд╕реНрдХреЛ рдореЗрдВ рдРрд╕рд╛ рди рдХрд░реЗрдВ, рджреВрд╕рд░реЗ рджреЗрд╢ рдореЗрдВ рдРрд╕рд╛ рдХрд░реЗрдВ", рдпрд╛ "рд╕реЙрд░реА, рдХреЙрдорд░реЗрдбред рдореИрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ рд╣реИред
- рдЕрдЧрд░ рдпрд╣ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЧрд▓рддреА рд╣реИ , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдореГрддрд┐ рд╕реЗ рдмрд╛рд╣рд░ , рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ: "рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ, рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред"
- рд╕рднреА рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

рдЖрдк CoroutineExceptionHandler рдХреЛ рдЬреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдЙрд╕реА рдбрд┐рд╕реНрдкреИрдЪрд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдБ рдЖрдк coroutine рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк "рд▓реЙрдиреНрдЪ" рдпреВрдЖрдИ рдХрдорд╛рдВрдб рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдпреВрдЖрдИ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░реЗрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ , рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

рдЙрдкрдпреЛрдЧ рд╕рд░рд▓ рд╣реИ:

 launch(uiDispatcher + handler) { ... } 

рдПрдХ рдкреНрд▓рд╕ рдСрдкрд░реЗрдЯрд░ рд╣реИред Coroutine рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╣рдордиреЗ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред

рдкрд░рд┐рдгрд╛рдо рдХрдХреНрд╖рд╛рдПрдВ


рдмрд╛рдж рдореЗрдВ рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ CoroutineExceptionHandler рдЧрд╛рдпрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо, рдЬреЛ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдХрд╛рдо рд╕реЗ рдмрдирддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХрдИ рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рдпрд╛ рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо рдХрдХреНрд╖рд╛рдПрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:

 sealed class Result { data class Success(val payload: String) : Result() data class Error(val exception: Exception) : Result() } 

- рдЖрдкрдХреЗ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдореЗрдВ, рдЖрдк рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╡рд░реНрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
- рд╕реАрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред
- рдЖрдкрдХреЛ рдХрдХреНрд╖рд╛ рджреЛ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рддреА рд╣реИ: рд╕рдлрд▓рддрд╛ рдФрд░ рддреНрд░реБрдЯрд┐ ред
тАФ Success , .
тАФ Error exception.

- :

 override suspend fun doTask(): Result = withContext(CommonPool) { if ( !isSessionValidForTask() ) { return@withContext Result.Error(Exception()) } тАж try { Result.Success(restApi.call()) } catch (e: Exception) { Result.Error(e) } } 

Coroutine context тАФ Coroutine builder withContex .

, :

тАФ , error. .
тАФ RestApi -.
тАФ , Result.Success .
тАФ , Result.Error .

- , ExceptionHandler .

Result classes , . Result classes, ExceptionHandler try-catch.

3.


, . unit- , , . unit-.

, . , unit-, 2 :

  1. Replacing context . , ;
  2. Mocking coroutines . .

Replacing context


presenter:

 val login() { launch(UI) { тАж } } 

, login , UI-. , , . , , unit-.

:

 val login (val coroutineContext = UI) { launch(coroutineContext) { ... } } 

тАФ login coroutineContext. , . Kotlin , UI .
тАФ Coroutine builder Coroutine Contex, .

unit- :

 fun testLogin() { val presenter = LoginPresenter () presenter.login(Unconfined) } 


тАФ LoginPresenter login - , , Unconfined.
тАФ Unconfined , , . .

Mocking coroutines


тАФ . Mockk unit-. unit- Kotlin, . suspend- coEvery -.

login githubUser :

 coEvery { apiClient.login(any()) } returns githubUser 

Mockito-kotlin , тАФ . , , :

 given { runBlocking { apiClient.login(any()) } }.willReturn (githubUser) 

runBlocking . given- , .

Presenter :

 fun testLogin() { val githubUser = GithubUser('login') val presenter = LoginPresenter(mockApi) presenter.login (Unconfined) assertEquals(githubUser, presenter.user()) } 

тАФ -, , GitHubUser .
тАФ LoginPresenter API, . .
тАФ presenter.login Unconfined , Presenter , .

рдФрд░ рд╡рд╣ рд╕рдм рд╣реИ! .




  • Rx- . . , RxJava RxJava. - тАФ , .
  • . , . Unit- тАФ , , , . тАФ welcome!
  • . , , , , . .


рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ



рд╕рдорд╛рдЪрд╛рд░

30 Mail.ru . , .

AppsConf , .

, , , .

youtube- AppsConf 2018 тАФ :)

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


All Articles