user.name}これならOK。コールバックのリークがなければ。Subscriptionを使う例コールバック方式の場合、途中でとめる仕組みがないとアクティビティが停止しても処理が進んじゃう。そのためこんなコードを書くよね。こんな感じになっちゃう。Componentが誕生した。wayRxJavaを使う方法もある。wayLiveDataだと、こんな感じで書ける。}解決済みの問題?現状、並行性に関する問題の解法は3つ。中断可能な計算LiveDataは「いいけど、より完璧なソリューション頼む」、RxJavaは「パワフルだけど、時に間違った使われ方をしたり、オーバーキルすぎたりする」コルーチンは「ベストっぽいが、エクステンションの充実と学習曲線がなぁ」Jetpackでは、コルーチンをメインとして、RxJavaはドキュメントでのサポートとするらしい。コルーチンコルーチンとは、コールバックスタイルを置き換える、非同期処理をシンプルにしてくれるもの。こんなコードがあったとする。(apiの実装にもよるが)UIスレッドをブロックしてしまったり、クラッシュしたりする。コールバックスタイルだと、こんな感じ。}}コルーチンだと、こんな感じになる。show(user)}ブロッキングスタイルだけど、UIをブロックしたりしない。こんなメソッドとして定義される。UIスレッドで呼んでも大丈夫。Kotlinではどうやってる?※ここは動画みたほうがわかりやすいかも。関数が呼ばれると、スタックにマーカーを置く。マーカーを置いてから、通常の関数呼び出しのように呼び出し位置をスタックに積む。関数が呼ばれると、マーカーまでを避難させて処理を続ける。呼んだ位置がちゃんと退避されているので、Dispatcherでの処理が終わった時点でちゃんとスタックの復元ができるという仕組み。コルーチンサポート済み。関数を呼ぶことができる。emit(db.load(userId))}Dispatcherを指定することもできる。emit(db.load(userId))}タイムアウトも指定できる。タイムアウトの指定があるのか?それは画面回転にともなうLiveDataのunsubscribeとsubscribeによるもの。画面回転すると、今の画面は使えないのでLiveDataに対してはunsubscribeが行われる。LiveData側からすると、subscribeしてるものがなくなるので処理を中止してよいことになってしまう。いう事態が発生してしまう。これではイケてないのでタイムアウトの概念が導入されている。こんな感じのコードが書ける。返したLiveDataに最新のデータがやってくる)。それをDBにいれる}ViewModelコルーチンは油断するとリークしてしまう(必要ないのに処理を続けてしまう)ので、Kotlinでは「スコープ」が導入されている。すべてのコルーチンはスコープの中で実行されないといけない。スコープは中で実行しているコルーチンを必要なときに全部キャンセルできる。ViewModelもコルーチンスコープになった。ViewModeの中で次のようなコードが書ける。}}画面遷移などでViewModelが破棄されるときにコルーチンもキャンセルされる。Lifecycleライフサイクルオーナーもコルーチンスコープとなるよう修正が入った。中で次のようなコードが書けるようになった。}}UIに関連した非同期処理がとても書きやすくなる。画面が表示されてから、1秒待ってヒントを出すといった際、こんな感じで書ける。}}画面回転とかでキャンセルされる!というのを忘れてはいけない。画面回転しても継続したほうがいいような処理はViewModelで。いうのが追加されている。STARTEDになっているかのチェックが入る。PAUSEDとかになっていたら続きの処理は行なわれない。いうライブラリがある。experimental。4とか5とか、お好きなのをどうぞ。こんなクラスを考えてみよう。}}テストコードはどうするか。TestCoroutineScope(testDispatcher)で、beforeとafterに設定を追加。testScope.cleanupTestCoroutines()}テストは、こんな感じで書く。JUnit4のRuleを使ってる。ライブラリで提供されている関数ではなく、こんな感じで自作したもの。KotlinがAndroidの公式言語になって2年。Libraryを読む(4)Stringには拡張関数がめっちゃ生えてる。In月別アーカイブはてなブログをはじめよう!fkmさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。