Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2018年09月3日

furusin

AndroidでKotlin Coroutinesを使ってみる

こんにちは。ピクトリンク事業部の古川です。

Androidでは従来ReactiveXが主流ですが、最近話題になっているCoroutinesを使った非同期処理の実装について解説します。

Coroutinesとは?

よく誤解されますが、CoroutinesとReactiveXは全くの別物です。

ReactiveXは非同期処理をストリームで実施するためのものですが、

Coroutinesは、「特定のスレッドに束縛されない、中断可能な計算処理インスタンス」です。

「特例のスレッドに束縛されない」ため、Androidでは非同期処理に用いられることが多いです。

そのためReactiveXとの比較で語られることが多いですが、性質が異なることを意識しておいてください。

Kotlinの公式ドキュメントに

「Coroutines simplify asynchronous programming by putting the complications into libraries.」(コルーチンは非同期処理をシンプルに書けるようにする)

と書いているのも誤解を呼ぶ要因の一つかと思います…

 

Kotlin Coroutinesを導入する

利用するにはbuild.gradleに情報を追加します。

また、Experimentalですので、その情報も追加します。

使い方

今回はサンプルとして、GitHubのAPIをRetrofitでコールしたレスポンスを画面に表示するアプリを作ってみます。

事前準備

RetforitでAPIを叩くために、InterfaceとModelを準備します。

実際に使ってみる

次に、このAPIを叩くメソッドを用意します。今回はViewModelに実装します。

fetchUserメソッドの1行目が最も重要な部分です。

まず返却値の型としてUserをDeferredで返します。ReactiveXだとSingle<User>になると思います。

async(CommonPool)はコルーチン内をスレッドプールで実行する、という理解でいいと思います(こちらを参考に)

後は通常通り、userを返却してあげているだけです。

それでは、このメソッドを呼び出してみます。

単純に「処理開始時にダイアログを表示し、終わったら画面に反映して閉じるだけ」の処理をしています。

launch(UI)は「UIスレッドで実行してね」という意味になります。

ここで .await() を呼んでいますが、これは「この処理が終わるまで続きの処理は awaitする(待つ)」という意味です。

最後に、画面に表示するXMLと画面イメージです。

activity-MainActivity-08302018161310

まとめ

非常に簡単ではありますが、以上でCoroutinesを試してみることができました。

完全にReactiveXをCoroutinesに置き換えることはまだまだ難しいとは思いますが、ReactiveXよりも考えることが比較的少なく、実装も容易ですので

今後はCoroutinesも選択肢のひとつになっていくと思います。

 


2018年08月29日

furusin

Kotlin ExtensionsのParcelizeアノテーションでdata classをスッキリさせる

こんにちは。ピクトリンク事業部の古川です。

今回はKotlinの便利機能である @Parcelize アノテーションについて解説します。

公式ドキュメントはこちらです。

ちなみにこの内容は、2018/08/25に行われたKotlin Fest 2018のセッション(start from Convert to Kotlin by 望月美帆さん)によって少し解説されたものです。

Parcelable とは

Parcelableは、例えばAndroidだとActivity間のデータ通信の際、一時的にデータを保存したい場合に利用します。

Kotlinでは、 バージョン1.1.4からExperimentalとして追加されました。

使い方

利用するにはkotlin-android-extensionsが必要ですので、build.gradleに追加しましょう。

また、Experimentalですので、その情報も追加します。

このアノテーションを利用しなかった場合は次のようになります。

このクラスに次のように @Parcelize アノテーションを追加すると、とてもシンプルになります。

関数すら無くなりました。

もちろん、何か独自のロジックを入れたい場合は追加することも可能です。

ちなみに

このUser.ktクラスをKotlinでなくJavaで書くと、次のようになります。

Javaだと膨大な量ですが、Kotlinだとたったの1行で完結しました!

Kotlin最高!

Kotlinかわいい!