Быстрый Взгляд На Async-Await В Android



От переводчика Это мой первый перевод, поэтому прошу прощения за неточности.

Если вы обнаружите ошибки в переводе, пожалуйста, сообщите об этом.

Лучшего перевода этого слова я не нашел сопрограмма , как сопрограмма , поэтому я решил использовать оригинал.

Если у вас есть идеи по этому поводу, буду рад узнать.

Версия 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

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.