AndroidでのAsync-Awaitの概要

翻訳者から


これが私の最初の翻訳ですので、不正確さをおIびします。 翻訳エラーを見つけた場合は、報告してください。 コルーチンよりもコルーチンという言葉のより良い翻訳を見つけられなかったので、オリジナルを使用することにしました。 これについて何かアイデアがあれば、喜んでお知らせします。







Kotlinバージョン1.1は、言語にcoroutin'yをもたらします。これにより、ある時点で計算を一時停止し、後で続行できます。 この機能の明らかな例は、数年前にC#に追加されたasync-awaitです。







すべてのAndroid開発者は、ネットワークリクエストまたは他のI / Oタスクを処理する場合、メインスレッドがブロックされないようにし、バックグラウンドスレッドからUIに触れないようにする必要があることを知っています。 長年にわたり、数十件のレセプションが開催されています。 この記事では、最も人気のあるものをリストし、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 AsyncTask



誰もそれらを使用していませんよね?







 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() }
      
      





コールバック



そして、誰がコールバック地獄を使用しますか?







 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 } }) }
      
      





Rx



クールなものを提供します...







 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.]" } }
      
      





ここで、 asyncUI (および同様のasync <T> )メソッドには、 awaitメソッドへのアクセスを提供するコルーチンの機能が含まれます。 実行がawaitメソッドに達するたびに、パラメーターが評価されるまで計算は一時停止されますが、呼び出しが行われたスレッドはブロックされません。 その後、コルーチンは実行を続けます。 asyncUIメソッドは、メインスレッドで実行が継続されるようにします。










お気づきのように、コルーチンはコードの可読性を向上させます。 現在、kotlinバージョン1.1-M02で利用可能です。 最新のasync-awaitの例では、Androidでコルーチンを使用する可能性のために作成したライブラリを使用しています 。 コルーチンについて詳しく知りたい場合は、 非公式の説明をご覧ください







PS:この記事には、activiへのリンクが含まれている可能性のある、実行のキャンセルとリスナーの削除は含まれていません。 各アプローチには同様のオプションがありますが、漏れはありません。







次の記事では、async-awaitのより詳細な分析を行いました。








All Articles