{"id":397765,"date":"2024-06-29T13:39:44","date_gmt":"2024-06-29T13:39:44","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=397765"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=397765","title":{"rendered":"<span>\u0421\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f Retrofit \u043d\u0430 Android<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u0430\u043a \u0412\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438? \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;\u041d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435&#187;? \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430  \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e <code>&lt;a href=\"<\/code><a href=\"https:\/\/github.com\/AndroidLab\/DeferredRequests_Example\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/AndroidLab\/DeferredRequests_Example<\/a><code>\"><\/code><em>\u0441\u0441\u044b\u043b\u043a\u0435<\/em><code>&lt;\/a><\/code>&lt;a\u00a0href=&#187;&#187;>&lt;\/a> \u043d\u0430 GitHub \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438! <\/p>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u0435\u0442\u0438, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0442\u0438.<\/p>\n<h2>\u0427\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f<\/h2>\n<ol>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043a\u044d\u0448 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0434\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0440\u0442\u0443, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. <\/p>\n<\/li>\n<\/ol>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Empty Activity, \u044f \u043d\u0430\u0437\u043e\u0432\u0443 \u0435\u0433\u043e DeferredRequests_Example<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/86b\/644\/3c5\/86b6443c5a1f334b03a449c551e3cf59.jpg\" width=\"900\" height=\"650\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/86b\/644\/3c5\/86b6443c5a1f334b03a449c551e3cf59.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/a68\/fd9\/4b6\/a68fd94b6f50f4c7ec452cad38b2a260.jpg\" width=\"900\" height=\"650\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a68\/fd9\/4b6\/a68fd94b6f50f4c7ec452cad38b2a260.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 build.gradle \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<pre><code class=\"kotlin\">implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h3>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 DeferredRequestsService<\/strong> <strong>\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestsService<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u044d\u0448.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredRequestsService<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0436\u0435\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.  * @param context \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.  * @param deferredRequestStorage \u041a\u044d\u0448 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  * @param deferredRequestsMap \u041a\u0430\u0440\u0442\u0430 \u0441 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438.  *\/ class DeferredRequestsService(     private val context: Context,     private val deferredRequestStorage: IDeferredRequestStorage,     private val deferredRequestsMap: IDeferredRequestsMap ) : IDeferredRequestsService {     private val _repeatJob = CoroutineScope(Dispatchers.IO).launch {         while (true) {             repeatRequest()             delay(5000)         }     }      private suspend fun repeatRequest(): Boolean {         if (deferredRequestStorage.countElements > 0) {             val requestModel = deferredRequestStorage.getRequestModel(0)             if (requestModel != null &amp;&amp; handleRequest(requestModel)) {                 deferredRequestStorage.removeRequestModel(requestModel)                 repeatRequest()             } else {                 return false             }         } else {             return true         }         return true     }      override suspend fun handleRequest(         requestModel: IDeferredRequestModel     ): Boolean {         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         if (requestModel.userId == null) {             requestModel.userId = UUID.fromString(\"12eb6997-6c60-4828-84e1-d4e211ba00a6\")         }         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         if (requestModel.userName == null) {             requestModel.userName = \"\u0418\u0432\u0430\u043d\u043e\u0432 \u0418\u0432\u0430\u043d \u0418\u0432\u0430\u043d\u043e\u0432\u0438\u0447\"         }         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d id \u0437\u0430\u043f\u0440\u043e\u0441\u0430         if (requestModel.requestId == null) {             requestModel.requestId = UUID.randomUUID()         }         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430         if (requestModel.date == null) {             requestModel.date = SimpleDateFormat(\"dd.MM.yyyy HH:mm\", Locale.getDefault()).format(Date())         }          var isSuccess = true         try {             deferredRequestsMap.getRequestExecutor(requestModel).execute(requestModel)         } catch (e: Exception) {             when (e) {                 \/\/\u041f\u043e \u044d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u0431\u044b\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d                 is SocketTimeoutException, is ConnectException, is UnknownHostException -> {                     isSuccess = false                 }                 else -> throw e             }         }          return if (isSuccess) {             true         } else {             if (deferredRequestStorage.addRequestModel(requestModel)) {                 Toast.makeText(context, \"\u0417\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043a\u044d\u0448\", Toast.LENGTH_LONG).show()             }             false         }     }      override suspend fun retryHandleRequests():Boolean {         _repeatJob.cancel()         val success = repeatRequest()         _repeatJob.start()         return success     }      override fun registerDeferredExecutorMap(deferredRequestExecutorMap: Map&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>) {         deferredRequestsMap.addRequestExecutor(deferredRequestExecutorMap)     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestsService<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.  *\/ interface IDeferredRequestsService {     \/**      * \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.      *\/     suspend fun handleRequest(         deferredRequestModel: IDeferredRequestModel     ): Boolean      \/**      * \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.      *\/     suspend fun retryHandleRequests(): Boolean      \/**      * \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441.      *\/     fun startService()      \/**      * \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441.      *\/     fun stopService()      \/*      * \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     fun registerDeferredExecutorMap(deferredRequestExecutorMap: Map&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 DeferredRequestStorage \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestStorage<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438 \u0442\u0434<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredRequestStorage<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  *\/ class DeferredRequestStorage : IDeferredRequestStorage {     private val _requests = mutableListOf&lt;IDeferredRequestModel>()     private val _requestsFlow = MutableSharedFlow&lt;List&lt;IDeferredRequestModel>>(extraBufferCapacity = 1, replay = 1)      override val requestsFlow: SharedFlow&lt;List&lt;IDeferredRequestModel>> = _requestsFlow.asSharedFlow()      override val countElements: Int         get() = _requests.size      override fun getRequestModel(position: Int) =         if(position > -1 &amp;&amp; position &lt; countElements) {             _requests[position]         } else {             null         }      override fun addRequestModel(requestModel: IDeferredRequestModel): Boolean {         return if (_requests.contains(requestModel)) {             false         } else {             _requests.add(requestModel)             _requestsFlow.tryEmit(_requests)             true         }     }      override fun removeRequestModel(requestModel: IDeferredRequestModel) {         _requests.remove(requestModel)         _requestsFlow.tryEmit(_requests)     }      override fun removeAllRequestsModel() {         _requests.clear()         _requestsFlow.tryEmit(_requests)     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestStorage<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  *\/ interface IDeferredRequestStorage {     \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.      *\/     val requestsFlow: SharedFlow&lt;List&lt;IDeferredRequestModel>>      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u044d\u0448\u0435.      *\/     val countElements: Int      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u043a\u044d\u0448\u0430.      * @param position \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043a\u044d\u0448\u0435.      *\/     fun getRequestModel(position: Int): IDeferredRequestModel?      \/**      * \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043a\u044d\u0448.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      * @return \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043a\u044d\u0448.      *\/     fun addRequestModel(deferredRequestModel: IDeferredRequestModel): Boolean      \/**      * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u043a\u044d\u0448\u0430.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     fun removeRequestModel(deferredRequestModel: IDeferredRequestModel)      \/**      * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u043a\u044d\u0448\u0430.      *\/     fun removeAllRequestsModel() }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestModel<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u0434\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestModel<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  *\/ interface IDeferredRequestModel {     \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     val title: String      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     val description: String      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.      *\/     var userId: UUID?      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.      *\/     var userName: String?      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     var requestId: UUID?      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     var date: String? }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestExecutor<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u0434\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestExecutor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  *\/ interface IDeferredRequestExecutor&lt;T> {     \/**      * \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     suspend fun execute(deferredRequestModel: T): Response&lt;ResponseBody> }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 DeferredExecutorsMap \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredExecutorsMap<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u0440\u0442\u0443, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredExecutorsMap<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  *\/ class DeferredExecutorsMap: IDeferredExecutorsMap {     private val commandsMap = mutableMapOf&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>()      override fun getRequestExecutor(         requestModel: IDeferredRequestModel     ): IDeferredRequestExecutor&lt;IDeferredRequestModel> =         commandsMap[requestModel::class.java] ?: throw RuntimeException(\"\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\")      override fun addRequestExecutor(assuranceCommandMap: Map&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>) {         commandsMap.putAll(assuranceCommandMap)     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredExecutorsMap<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043a\u0430\u0440\u0442\u044b \u0441 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438.  *\/ interface IDeferredExecutorsMap {     \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f.      * @param deferredRequestDataClass \u041a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     fun getRequestExecutor(         deferredRequestDataClass: IDeferredRequestModel     ): IDeferredRequestExecutor&lt;IDeferredRequestModel>      \/**      * \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0434\u043b\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      * @param assuranceCommandMap \u041a\u0430\u0440\u0442\u0430 \u0434\u043b\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     fun addRequestExecutor(assuranceCommandMap: Map&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IVKApiService<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0435\u0442\u0440\u043e\u0444\u0438\u0442\u043e\u043c \u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u043e \u0441\u0442\u0435\u043d\u044b \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435  \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 id. \u041d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430 &#171;User authorization failed: no access_token passed.&#187;, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0432\u0430\u0436\u043d\u043e, \u0432\u0430\u0436\u0435\u043d \u0441\u0430\u043c \u0444\u0430\u043a\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IVKApiService<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a Vkontakte.  *\/ interface IVKApiService {      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u043e \u0441\u0442\u0435\u043d\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 id.      *\/     @GET(\"wall.get\")     suspend fun getWall(         @Query(\"owner_id\") owner_id: String     ): Response&lt;ResponseBody> }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 VKontakteRequestModel \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f VKontakteRequestExecutor<\/strong><\/p>\n<p>\u041a\u043b\u0430\u0441\u0441 <em>VKontakteRequestModel<\/em><strong> <\/strong>\u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 <em>VKontakteRequestExecutor <\/em>\u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0442\u0440\u043e\u0444\u0438\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 VKontakteRequestModel<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435.  * @param ownerId \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0433\u0440\u0443\u043f\u043f\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  *\/ data class VKontakteRequestModel(     val ownerId: String,     override val title: String = \"\u0417\u0430\u043f\u0440\u043e\u0441 \u043a \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435\",     override val description: String = \"\u0417\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u043e \u0441\u0442\u0435\u043d\u044b \u0433\u0440\u0443\u043f\u043f\u044b \u0412\u041a\",     override var userId: UUID? = null,     override var userName: String? = null,     override var requestId: UUID? = null,     override var date: String? = null ) : IDeferredRequestModel<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 VKontakteRequestExecutor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435.  * @param vkApiService \u0421\u0435\u0440\u0432\u0438\u0441 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435.  *\/ class VKontakteRequestExecutor (     private val vkApiService: IVKApiService ) : IDeferredRequestExecutor&lt;VKontakteRequestModel> {     override suspend fun execute(deferredRequestModel: VKontakteRequestModel): Response&lt;ResponseBody> {         return vkApiService.getWall(deferredRequestModel.ownerId)     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041a\u043b\u0430\u0441\u0441 DeferredRequestApplication<\/h2>\n<p>\u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d\u044b <em>IDeferredRequestsService<\/em>, <em>IDeferredRequestStorage<\/em> \u0438 <em>IDeferredExecutorsMap<\/em>. \u041f\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u043d\u0438 \u0431\u0443\u0434\u044c DI \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043d\u043e \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a.  \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredRequestApplication<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435.  *\/ class DeferredRequestApplication : Application() {      var retrofit = Retrofit.Builder().baseUrl(\"https:\/\/api.vk.com\/method\/\").addConverterFactory(GsonConverterFactory.create()).build()  \/\/ Retrofit.     lateinit var deferredRequestsService: IDeferredRequestsService   \/\/ \u0421\u0435\u0440\u0432\u0438\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0436\u0435\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.     lateinit var deferredRequestStorage: IDeferredRequestStorage   \/\/ \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.     lateinit var deferredExecutorsMap: IDeferredExecutorsMap   \/\/ \u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.      companion object {         lateinit var application: DeferredRequestApplication     }      override fun onCreate() {         super.onCreate()         application = this         deferredRequestStorage = DeferredRequestStorage()         deferredExecutorsMap = DeferredExecutorsMap()         deferredRequestsService = DeferredRequestsService(this, deferredRequestStorage, deferredExecutorsMap)     }  }<\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u041a\u043b\u0430\u0441\u0441 MainActivity \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 xml activity_main<\/h2>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u044d\u043a\u0440\u0430\u043d, \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 2 \u043a\u043d\u043e\u043f\u043a\u0438. \u041f\u0435\u0440\u0432\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u044b\u043b\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043d\u0430\u043c \u044d\u043a\u0440\u0430\u043d \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0444\u0430\u0439\u043b\u0435 <em>&lt;uses-permission android:name=&#187;android.permission.INTERNET&#187; \/><\/em><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 MainActivity<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.  *\/ class MainActivity : AppCompatActivity() {      private val deferredRequestsService = DeferredRequestApplication.application.deferredRequestsService      override fun onCreate(savedInstanceState: Bundle?) {         super.onCreate(savedInstanceState)         setContentView(R.layout.activity_main)          val testRequest = DeferredRequestApplication.application.retrofit.create(IVKApiService::class.java)          \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0443, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447 \u044d\u0442\u043e \u043a\u043b\u0430\u0441\u0441 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430         deferredRequestsService.registerDeferredExecutorMap(mapOf(VKontakteRequestModel::class.java to VKontakteRequestExecutor(testRequest) as IDeferredRequestExecutor&lt;IDeferredRequestModel>))          findViewById&lt;Button>(R.id.deferredRequestsBtn).setOnClickListener {             \/\/ TODO \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: https:\/\/github.com\/AndroidLab\/DeferredRequests_Example         }          findViewById&lt;Button>(R.id.sendRequestBtn).setOnClickListener {             lifecycleScope.launch {                 \/\/\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430                 val vkontakteRequestModel = VKontakteRequestModel(                     ownerId = \"-1\"   \/\/-1 \u044d\u0442\u043e id \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u044b \u0432\u043a, https:\/\/vk.com\/club1                 )                 \/\/\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u0448 \u0441\u0435\u0440\u0432\u0438\u0441, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0435\u0441\u0442\u044c, \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u043e\u0436\u0435\u043d \u043a \u043a\u044d\u0448                 deferredRequestsService.handleRequest(vkontakteRequestModel)             }         }     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>xml activity_main<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?> &lt;FrameLayout xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"     xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"     xmlns:tools=\"http:\/\/schemas.android.com\/tools\"     android:layout_width=\"match_parent\"     android:layout_height=\"match_parent\"     tools:context=\".MainActivity\">      &lt;Button         android:id=\"@+id\/sendRequestBtn\"         android:layout_width=\"match_parent\"         android:layout_height=\"wrap_content\"         android:text=\"\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\"         android:layout_margin=\"16dp\"         app:layout_constraintBottom_toBottomOf=\"@id\/deferredRequestsBtn\"         app:layout_constraintLeft_toLeftOf=\"parent\"         app:layout_constraintRight_toRightOf=\"parent\"         app:layout_constraintTop_toTopOf=\"parent\"\/>      &lt;Button         android:id=\"@+id\/deferredRequestsBtn\"         android:layout_width=\"match_parent\"         android:layout_height=\"wrap_content\"         android:layout_marginTop=\"72dp\"         android:layout_marginHorizontal=\"16dp\"         android:text=\"\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b\"         app:layout_constraintBottom_toBottomOf=\"parent\"         app:layout_constraintHorizontal_bias=\"0.0\"         app:layout_constraintLeft_toLeftOf=\"parent\"         app:layout_constraintRight_toRightOf=\"parent\"         app:layout_constraintTop_toTopOf=\"@id\/sendRequestBtn\" \/>  &lt;\/FrameLayout><\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u043e\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c <code>&lt;a href=\"<\/code><a href=\"https:\/\/github.com\/AndroidLab\/DeferredRequests_Example\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/AndroidLab\/DeferredRequests_Example<\/a><code>\">\u0417\u0434\u0435\u0441\u044c&lt;\/a><\/code><\/p>\n<h2>\u041f\u0440\u043e\u0431\u0443\u0435\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h2>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0438\u0439\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442 (\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0441\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0438 \u0432\u043d\u0438\u0437\u0443 \u0441\u0442\u0430\u0442\u044c\u0438), \u0443\u0432\u0438\u0434\u0438\u043c \u044d\u043a\u0440\u0430\u043d \u0441 2 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/b04\/16d\/37f\/b0416d37fd0d0025c34391a67c6d84f9.jpg\" width=\"623\" height=\"1076\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b04\/16d\/37f\/b0416d37fd0d0025c34391a67c6d84f9.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0436\u043c\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441&#187;, \u0435\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d, \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <em>&#171;Response{protocol=h2, code=200, message=, url=<\/em><a href=\"https:\/\/api.vk.com\/method\/wall.get?owner_id=-1%7D\" rel=\"noopener noreferrer nofollow\"><em>https:\/\/api.vk.com\/method\/wall.get?owner_id=-1}<\/em><\/a><em>&#171;<br \/>\u0412\u0441\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0432\u0438\u0434\u0438\u043c \u043a\u043e\u0434 200, \u0437\u0430\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0431\u044b\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d.<\/p>\n<p><\/em>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c &#171;\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441&#187;, \u0432\u0438\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <em>&#171;\u0417\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043a\u044d\u0448&#187;. \u0417\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0438 \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u0438\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;Response{protocol=h2, code=200, message=, url=<\/em><a href=\"https:\/\/api.vk.com\/method\/wall.get?owner_id=-1%7D\" rel=\"noopener noreferrer nofollow\"><em>https:\/\/api.vk.com\/method\/wall.get?owner_id=-1}<\/em><\/a><em>&#171;, \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d.<\/em><\/p>\n<h2>\u042d\u043a\u0440\u0430\u043d \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438<\/h2>\n<p>\u042f \u043d\u0435 \u0431\u0443\u0434\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0435\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c &lt;a\u00a0href=&#187;<em>\u0441\u043a\u0430\u0447\u0430\u0432 \u043f\u0440\u0438\u043c\u0435\u0440<\/em>&#171;><a href=\"https:\/\/github.com\/AndroidLab\/DeferredRequests_Example\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/AndroidLab\/DeferredRequests_Example<\/a>&lt;\/a>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u043d\u0430\u0436\u043c\u0435\u043c 2 \u0440\u0430\u0437\u0430 &#171;\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441&#187;, \u043e\u043d\u0438 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u0441\u044f \u0438 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043a \u043a\u044d\u0448. \u041d\u0430\u0436\u043c\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u041e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b&#187;.<\/p>\n<details class=\"spoiler\">\n<summary>\u042d\u043a\u0440\u0430\u043d \u0441 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/7a7\/dc2\/0f6\/7a7dc20f61b459b505e98c6e8eb1be8d.jpg\" width=\"610\" height=\"1063\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a7\/dc2\/0f6\/7a7dc20f61b459b505e98c6e8eb1be8d.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0438\u0434\u0438\u043c 2 \u043d\u0430\u0448\u0438\u0445 \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u041f\u043e\u043a\u0430 \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u044d\u043a\u0440\u0430\u043d\u0435, \u0441\u0435\u0440\u0432\u0438\u0441 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438. \u041e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u043a\u044d\u0448\u0443, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043a\u043d\u043e\u043f\u043a\u0443 &#171;\u041e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c&#187;, \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u044f\u0442\u0441\u044f, \u0430 \u043c\u044b \u0441\u043d\u043e\u0432\u0430 \u0443\u0432\u0438\u0434\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c 200<br \/><em>&#171;Response{protocol=h2, code=200, message=, url=<\/em><a href=\"https:\/\/api.vk.com\/method\/wall.get?owner_id=-1%7D\" rel=\"noopener noreferrer nofollow\"><em>https:\/\/api.vk.com\/method\/wall.get?owner_id=-1}<\/em><\/a><em>&#171;<\/em><\/p>\n<p> <code>&lt;a href=\"<\/code><a href=\"https:\/\/github.com\/AndroidLab\/DeferredRequests_Example\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/AndroidLab\/DeferredRequests_Example<\/a><code>\"><\/code>\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c<code>&lt;\/a><\/code><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/580056\/\"> https:\/\/habr.com\/ru\/articles\/580056\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u0430\u043a \u0412\u044b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0435 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438? \u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 &#171;\u041d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043f\u043e\u0437\u0436\u0435&#187;? \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430  \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0435\u0433\u043e \u0438\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u0438 \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0438 \u043d\u0430\u0443\u0447\u0438\u043c\u0441\u044f \u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u043e <code>&lt;a href=\"<\/code><a href=\"https:\/\/github.com\/AndroidLab\/DeferredRequests_Example\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/AndroidLab\/DeferredRequests_Example<\/a><code>\"><\/code><em>\u0441\u0441\u044b\u043b\u043a\u0435<\/em><code>&lt;\/a><\/code>&lt;a\u00a0href=&#187;&#187;>&lt;\/a> \u043d\u0430 GitHub \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438! <\/p>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u0435\u0442\u0438, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u0442\u0438.<\/p>\n<h2>\u0427\u0442\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f<\/h2>\n<ol>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0436\u0434\u0430\u0442\u044c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043a\u044d\u0448 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0434\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0440\u0442\u0443, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438. <\/p>\n<\/li>\n<\/ol>\n<h2>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 Empty Activity, \u044f \u043d\u0430\u0437\u043e\u0432\u0443 \u0435\u0433\u043e DeferredRequests_Example<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 build.gradle \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<pre><code class=\"kotlin\">implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'<\/code><\/pre>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/h3>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 DeferredRequestsService<\/strong> <strong>\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestsService<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043b\u043e\u0436\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u044d\u0448.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredRequestsService<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0436\u0435\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.  * @param context \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.  * @param deferredRequestStorage \u041a\u044d\u0448 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  * @param deferredRequestsMap \u041a\u0430\u0440\u0442\u0430 \u0441 \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u043c\u0438.  *\/ class DeferredRequestsService(     private val context: Context,     private val deferredRequestStorage: IDeferredRequestStorage,     private val deferredRequestsMap: IDeferredRequestsMap ) : IDeferredRequestsService {     private val _repeatJob = CoroutineScope(Dispatchers.IO).launch {         while (true) {             repeatRequest()             delay(5000)         }     }      private suspend fun repeatRequest(): Boolean {         if (deferredRequestStorage.countElements > 0) {             val requestModel = deferredRequestStorage.getRequestModel(0)             if (requestModel != null &amp;&amp; handleRequest(requestModel)) {                 deferredRequestStorage.removeRequestModel(requestModel)                 repeatRequest()             } else {                 return false             }         } else {             return true         }         return true     }      override suspend fun handleRequest(         requestModel: IDeferredRequestModel     ): Boolean {         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         if (requestModel.userId == null) {             requestModel.userId = UUID.fromString(\"12eb6997-6c60-4828-84e1-d4e211ba00a6\")         }         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f         if (requestModel.userName == null) {             requestModel.userName = \"\u0418\u0432\u0430\u043d\u043e\u0432 \u0418\u0432\u0430\u043d \u0418\u0432\u0430\u043d\u043e\u0432\u0438\u0447\"         }         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b \u0443\u043a\u0430\u0437\u0430\u043d id \u0437\u0430\u043f\u0440\u043e\u0441\u0430         if (requestModel.requestId == null) {             requestModel.requestId = UUID.randomUUID()         }         \/\/\u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430         if (requestModel.date == null) {             requestModel.date = SimpleDateFormat(\"dd.MM.yyyy HH:mm\", Locale.getDefault()).format(Date())         }          var isSuccess = true         try {             deferredRequestsMap.getRequestExecutor(requestModel).execute(requestModel)         } catch (e: Exception) {             when (e) {                 \/\/\u041f\u043e \u044d\u0442\u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u0431\u044b\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d                 is SocketTimeoutException, is ConnectException, is UnknownHostException -> {                     isSuccess = false                 }                 else -> throw e             }         }          return if (isSuccess) {             true         } else {             if (deferredRequestStorage.addRequestModel(requestModel)) {                 Toast.makeText(context, \"\u0417\u0430\u043f\u0440\u043e\u0441 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043a\u044d\u0448\", Toast.LENGTH_LONG).show()             }             false         }     }      override suspend fun retryHandleRequests():Boolean {         _repeatJob.cancel()         val success = repeatRequest()         _repeatJob.start()         return success     }      override fun registerDeferredExecutorMap(deferredRequestExecutorMap: Map&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>) {         deferredRequestsMap.addRequestExecutor(deferredRequestExecutorMap)     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestsService<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.  *\/ interface IDeferredRequestsService {     \/**      * \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443.      *\/     suspend fun handleRequest(         deferredRequestModel: IDeferredRequestModel     ): Boolean      \/**      * \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b.      *\/     suspend fun retryHandleRequests(): Boolean      \/**      * \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441.      *\/     fun startService()      \/**      * \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441.      *\/     fun stopService()      \/*      * \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     fun registerDeferredExecutorMap(deferredRequestExecutorMap: Map&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>) }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 DeferredRequestStorage \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestStorage<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0441\u0435\u0431\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c, \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u0438 \u0442\u0434<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredRequestStorage<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  *\/ class DeferredRequestStorage : IDeferredRequestStorage {     private val _requests = mutableListOf&lt;IDeferredRequestModel>()     private val _requestsFlow = MutableSharedFlow&lt;List&lt;IDeferredRequestModel>>(extraBufferCapacity = 1, replay = 1)      override val requestsFlow: SharedFlow&lt;List&lt;IDeferredRequestModel>> = _requestsFlow.asSharedFlow()      override val countElements: Int         get() = _requests.size      override fun getRequestModel(position: Int) =         if(position > -1 &amp;&amp; position &lt; countElements) {             _requests[position]         } else {             null         }      override fun addRequestModel(requestModel: IDeferredRequestModel): Boolean {         return if (_requests.contains(requestModel)) {             false         } else {             _requests.add(requestModel)             _requestsFlow.tryEmit(_requests)             true         }     }      override fun removeRequestModel(requestModel: IDeferredRequestModel) {         _requests.remove(requestModel)         _requestsFlow.tryEmit(_requests)     }      override fun removeAllRequestsModel() {         _requests.clear()         _requestsFlow.tryEmit(_requests)     } }<\/code><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestStorage<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  *\/ interface IDeferredRequestStorage {     \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.      *\/     val requestsFlow: SharedFlow&lt;List&lt;IDeferredRequestModel>>      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u043a\u044d\u0448\u0435.      *\/     val countElements: Int      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u043a\u044d\u0448\u0430.      * @param position \u041f\u043e\u0437\u0438\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043a\u044d\u0448\u0435.      *\/     fun getRequestModel(position: Int): IDeferredRequestModel?      \/**      * \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043a\u044d\u0448.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      * @return \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432 \u043a\u044d\u0448.      *\/     fun addRequestModel(deferredRequestModel: IDeferredRequestModel): Boolean      \/**      * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438\u0437 \u043a\u044d\u0448\u0430.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     fun removeRequestModel(deferredRequestModel: IDeferredRequestModel)      \/**      * \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0437 \u043a\u044d\u0448\u0430.      *\/     fun removeAllRequestsModel() }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestModel<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u0434\u043b\u044f \u0434\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestModel<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  *\/ interface IDeferredRequestModel {     \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     val title: String      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     val description: String      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.      *\/     var userId: UUID?      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.      *\/     var userName: String?      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     var requestId: UUID?      \/**      * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     var date: String? }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestExecutor<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0432 \u0441\u0435\u0431\u044f \u0434\u0430\u0442\u0430 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredRequestExecutor<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f \u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.  *\/ interface IDeferredRequestExecutor&lt;T> {     \/**      * \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0437\u0430\u043f\u0440\u043e\u0441.      * @param deferredRequestModel \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430.      *\/     suspend fun execute(deferredRequestModel: T): Response&lt;ResponseBody> }<\/code><\/pre>\n<\/div>\n<\/details>\n<p><strong>\u041a\u043b\u0430\u0441\u0441 DeferredExecutorsMap \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 IDeferredExecutorsMap<\/strong><\/p>\n<p>\u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u043a\u0430\u0440\u0442\u0443, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 DeferredExecutorsMap<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"kotlin\">\/**  * \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u0430\u0440\u0442\u0443 \u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044f\u043c\u0438 \u0434\u043b\u044f \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.  *\/ class DeferredExecutorsMap: IDeferredExecutorsMap {     private val commandsMap = mutableMapOf&lt;Class&lt;out IDeferredRequestModel>, IDeferredRequestExecutor&lt;IDeferredRequestModel>>()      override fun getRequestExecutor(         requestModel: IDeferredRequestModel     ):<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-397765","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/397765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=397765"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/397765\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=397765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=397765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=397765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}