От переводчика Это мой первый перевод, поэтому прошу прощения за неточности.
Если вы обнаружите ошибки в переводе, пожалуйста, сообщите об этом.
Лучшего перевода этого слова я не нашел сопрограмма , как сопрограмма , поэтому я решил использовать оригинал.
Если у вас есть идеи по этому поводу, буду рад узнать.
Версия Kotlin 1.1 внесет в язык сопрограммы , которые позволяют в какой-то момент приостановить вычисления, а затем продолжить их позже.
Очевидным примером этой возможности является асинхронное ожидание , который был добавлен в C# несколько лет назад. Каждый разработчик Android знает, что когда мы имеем дело с сетевыми запросами или другими задачами ввода-вывода, нам необходимо убедиться, что основной поток не заблокирован и что мы не трогаем пользовательский интерфейс из фонового потока.
За прошедшие годы произошли десятки назначений.
В этой статье перечислены наиболее популярные из них и показаны примеры удобства, которое дает async-await.
Сценарий
Мы хотим получить данные пользователя Github и поместить их в базу данных, а затем показать результат на экране.Я не объяснил подходы; они будут говорить сами за себя.
Старая добрая тема
Ручное управление, полный контрольfun threads() { val handler = Handler() Thread { try { val user = githubApi.user() userRepository.store(user) handler.post { threadsTV.text = "threads: [$user]" } } catch(e: IOException) { handler.post { threadsTV.text = "threads: [User retrieval failed.]" } } }.
start() }
Android-асинхронная задача
Никто ими больше не пользуется, верно? fun asyncTask() {
object : AsyncTask<Unit, Unit, GithubUser?>() {
private var exception: IOException? = null
override fun doInBackground(vararg params: Unit): GithubUser? {
try {
val user = githubApi.user()
userRepository.store(user)
return user
} catch(e: IOException) {
exception = e
return null
}
}
override fun onPostExecute(user: GithubUser?) {
if (user != null) {
asyncTaskTV.text = "asyncTask: [$user]"
} else {
asyncTaskTV.text = "asyncTask: [User retrieval failed.]"
}
}
}.
execute()
}
Обратные вызовы
Кто-нибудь пользуется Callback-hell? fun callbacks() {
githubApi.userFromCall().
enqueue(object : Callback<GithubUser> {
override fun onResponse(call: Call<GithubUser>, response: Response<GithubUser>) {
val user = response.body()
userRepository.storeCallback(user) {
callbacksTV.text = "callbacks: [$user]"
}
}
override fun onFailure(call: Call<GithubUser>, t: Throwable) {
if (t is IOException)
callbacksTV.text = "callbacks: [User retrieval failed.]"
else
throw t
}
})
}
прием
Предлагает крутые вещи.
fun rx() {
githubApi.userRx()
.
flatMap { user -> userRepository.storeRx(user).
toSingle { user } } .
observeOn(AndroidSchedulers.mainThread()) .
subscribe(
{ user ->
rxTV.text = "rx: [$user]"
},
{ throwable ->
if (throwable is IOException)
rxTV.text = "rx: [User retrieval failed.]"
else
throw throwable
}
)
}
Асинхронное ожидание
Как вы на это смотрите? fun asyncAwait() = asyncUI {
try {
val user = await(githubApi.userAsync())
await(userRepository.storeAsync(user))
asyncAwaitTV.text = "asyncAwait: [$user]"
} catch(e: IOException) {
asyncAwaitTV.text = "asyncAwait: [User retrieval failed.]"
}
}
Здесь асинхронный интерфейс (и подобные асинхронный ) метод включит функциональность сопрограммы, которая обеспечивает доступ к методу Ждите .
Каждый раз, когда выполнение достигает метода Ждите , вычисление приостанавливается до тех пор, пока параметр не будет вычислен, но поток, в котором произошел вызов, не блокируется.
После этого сопрограмма продолжит свое выполнение.
Метод асинхронный интерфейс гарантирует, что выполнение продолжится в основном потоке.
Как вы заметили, сопрограмма улучшает читаемость кода.
Сейчас они доступны в версии Kotlin 1.1-M02. Последний пример использования async-await библиотека, которую я написал чтобы иметь возможность использовать сопрограммы на Android. Если вы хотите узнать больше о сопрограммах, вы можете проверить неофициальное описание ПС: В этой статье не содержится информация об отмене выполнения и удалении прослушивателей, которые могут содержать ссылки на действия.
У каждого подхода может быть аналогичный вариант, но без утечек.
В следующей статье Я сделал более детальный анализ async-await. Теги: #Android #Kotlin #async #await #await/async #теги читают все #но почему? #разработка под Android #разработка под Android #Kotlin
-
Вышла Версия Мечты V1.0.2
19 Oct, 24 -
Крикет, Болливуд И Местные Языки
19 Oct, 24 -
Xbox 360 Получит Чат И Клавиатуру
19 Oct, 24