retrofitAndroid版いこーよを担当しているhondaです。Coroutines(以下、コルーチン)を使い始めました。コルーチンは簡単に言うと「スレッドインスタンスのようなものであり、中断可能な計算インスタンス」と言えます。コルーチンは「中断されている最中にスレッドをブロックしない」という特徴を持っています。通信処理や時間がかかる処理などを非同期で実行でき、かつシンプルなコードで実装できます。コルーチンについては前回のエントリーでも簡単にですが紹介しました。tech.actindi.netいこーよで通信処理にRetrofitを使っています。Retrofitはバージョン2.5までコルーチンには未対応でした。よって、バージョン2.5までのRetrofitでコルーチンを使うためには前回のエントリーで書いたようにこちらのサードパーティーのライブラリを使用したり、自前でDeferredを使って対応する必要があります。最新バージョン2.6でコルーチンに対応したことによって、サードパーティや独自実装なしでコルーチンを使って非同期通信処理を書けるようになりました。今回はGitHubのSearchAPIに対してのGETリクエストする処理でコルーチンを使わない場合と使った場合でコードの比較をしたいと思います。GitHubRepositoriesData}ここでの違いはsuspendと戻り値です。コルーチンを使わないコートではリクエストの結果が返ってくるCallオブジェクトを返しますコルーチンを使ったコードではインターフェースとなるメソッドにsuspend修飾子が付き、Callオブジェクトではなく、GETリクエストで取得できるデータのオブジェクトを返します。suspend修飾子はそのメソッドがコルーチンを中断するかもしれないことを表します。今回の場合はRetrofit側がGETリクエストを開始してからレスポンスが返ってくるまでコルーチンを中断するため、suspend修飾子を付ける必要があります。.create(GitHubServiceInterface::class.java)}ここはとくにコードの違いはありません。}ここでの違いはコールバックと再び出てきたsuspend修飾子です。コルーチンを使わないコードではGETリクエストで得られるデータやGETリクエストが失敗時の結果をコールバックで受け取る必要がありますコルーチンを使うコードではまずGETリクエストを行うメソッドはsuspend修飾子が付いています。これは前述したGitHubEndpointInterface.getSearchedRepositoriesByCoroutines()にsuspend修飾子が付いているため、それを呼び出すfetchSearchedRepositoriesByCoroutines()にもsuspend修飾子を付ける必要があるからです。GETリクエストで得られるデータはメソッドの戻り値として取得することができます。コルーチンを使ったコードのほうが圧倒的にシンプルに書けることがわかります。}ここでの違いはcoroutineScope.launchです。CoroutineScope#launchメソッドでコルーチンが生成、実行されます。*1コルーチンを使っているコードではその生成、実行されたコルーチンの中でfetchSearchedRepositoriesByCoroutinesを呼び出して結果を戻り値として取得することが出来ます。非同期通信処理を通常のメソッド呼び出しのように「同期的な」書き方で実装できるため、見通しが良くなることがおわかりになると思います。まとめRetrofitがコルーチンに対応したことで、Retrofitを使った非同期通信処理がとてもシンプルに書けるようになりました。コルーチンに特性により、意図しないUIスレッドのブロックを防ぐことも出来ます。シンプルに書けることによって、よりアプリとして本質的な機能実装にフォーカスすることができるようになりました。ComponentsでのViewModelなどで生成し、Androidのライフサイクルにリンクするように使用するのが一番多いかと思います。09:00Tweet関連記事2020-01-27天気予報APIを使って天気を表示してみた新米Webエンジニアのhiroさんです。CDKでLambdaをデプロイしてみた。morishitaです。Performanceを測ってみた。前編morishitaです。APIのモックを楽しよう!morishitaです。serviceをwebhookに変更したmorishitaです。(12)引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。