※ソース記事はこちら
このハンズオンチュートリアルでは、コルーチンの概要に慣れ親しむ予定である。コルーチンにより、非同期でノンブロッキングなふるまいのあらゆるメリットが、可読性を損なわずに提供される。コルーチンを使って、下層にあるスレッドをブロッキングせず、コールバックを使わずにネットワーク要求を実行する方法を見ていく。
次のことを学習する。
- ネットワーク要求を実行するために、suspend関数を使う理由と方法
- コルーチンを使って、並列に要求を送る方法
- チャネルを使って、異なるコルーチンの間で情報を共有する方法
コルーチンが他の既存のソリューションとどのように異なるのか、についても議論していく。
基本的なKotlinの文法について精通していることが要求されるが、コルーチンの事前知識は必要ではない。
ネットワーク要求のため、コルーチンをサポートする、Retrofitライブラリを使用するが、このチュートリアルのアプローチは普遍的であり、異なるライブラリでも同様に効果がある。
このチュートリアルは、KotlniConfでのRoman ElizarovによるKotlin非同期プログラミングのワークショップをもとにしている。
セットアップ
IntelliJ IDEAが必要である。最新の無料のcommunityバージョンをここからダウンロードできる。
Kotlinプラグインのバージョン1.4がインストールされていることを確認してください。Kotlinプラグインを更新するには、ツール-Kotlin-Kotlinプラグインのアップデートを構成
を使うこと。
プロジェクトのダウンロード
スプラッシュ画面上で、VCSから取得
を選択するか、ファイル-新規-バージョン管理からプロジェクト...
を選択し、プロジェクトパス http://github.com/kotlin-hands-on/intro-coroutines を指定することにより、IntelliJからリポジトリをクローンする。
...あるいは、コマンドラインからクローンする。
$ git clone http://github.com/kotlin-hands-on/intro-coroutines
プロジェクトにはsolution
ブランチが含まれており、自分の解答と模範解答を比較するために、ブランチと比較...
を使うことができる。
GitHubデベロッパートークンの生成
GitHub APIを使うため、自分のGitHubアカウント名と、パスワードかトークンのどちらかを指定する必要がある。GitHub上で、二要素認証を有効にしている場合は、トークンのみ動くだろう。
こちらで、自分のアカウントから、GitHub APIを使うためのトークンを生成することができる。
https://github.com/settings/tokens/new トークンの名前をたとえば、coroutines-hands-on
と指定すること。
スコープを選択する必要はなく、画面の底にある"Generate token"をクリックすること。生成されたトークンをどこかにコピーすること。それはすぐに使う。
コードの実行
src/contributors/main.kt
ファイルを開き、main
関数を実行する。その後、下にあるようなウィンドウが表示されるはずである(ただしデータはロードされていない)。
※筆者の環境ではJVMの例外で起動しないことがあったが、その場合、VM引数に-Dfile.encoding=ISO-8859-1
を指定することで起動することができた。
フォントが小さすぎる場合は、main
関数内で異なるデフォルトサイズを指定する。
このプログラムは、与えられたオーガニゼーション配下のすべてのリポジトリのコントリビューターをロードする。デフォルトでは、オーガニゼーションは"kotlin"だが、ほかのものも可能である。後で、コントリビューターの数により、ユーザーをソートするロジックを追加しよう。
それでは、対応する項目に、GitHubユーザー名とトークン(あるいはパスワード)を埋める。VariantドロップダウンメニューではBLOCKINGが選択されていることを確認し、"Load contributers"ボタンをクリックする。UIはしばらくの間フリーズして、その後コントリビューターの一覧を表示するはずである。プログラムの出力を開き、データがロードされていることを確認できる。つまりそれぞれのリクエストが成功した後で、情報はログされている。継続する前にロードされたデータは見ることができる。
このロジックを実行する様々な方法を比較し、コルーチンが物事を変える方法を見ていく。コルーチンを使い始める前に、ほかのどのようなソリューションが可能かを見てみよう。まず、ブロッキングな方法でロジックを実装する方法を見ていく。つまり、読みやすくそのために、UIをフリーズさせるためよくない。その後、修正するために、コールバックを使い、これらのソリューションとコルーチンを使った場合とを比較する。最後に異なるコルーチンの間で情報を共有するためにChannelを使う方法を見ていく。
それでは始めよう!