引き続き以下なリポジトリのソースを確認を。
とりあえず確認しておきたいのは Observable#subscribe に lambda が渡されているらしい件。本来ならば Oberver なナニが渡されないと駄目なはずです。
で、SearchActivity なソースを見てみるに、subscribe に渡されているのはほとんどが lambda な手続きオブジェクト風。
色々調べてみるに
どうも SAM 変換という事をしてくれるらしく
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer param) {
System.out.println(param);
}
}
みたいなソレは以下なカンジにできる模様。
.subscribe { println(it) }
上記は Kotlin マターなルールがあるようで、こちらによると
- メソドの最後の引数が関数リテラルの場合、括弧の省略が可能
- 関数リテラルで引数が一つの場合、仮引数の記述の省略が可能
- 型推論可能な場合、関数リテラルの型の記述の省略が可能
- SAM 型インターフェースを引数に取るメソッドに関数リテラルを渡す場合のみ、変換が行なわれる
との事。成程。というか、new Action1<Integer>()
というあたりがアレなのでもう少し確認を。ええと、Action とか Function とかって Observer と同様に Observable の変化に対して振る舞うもの、らしい。ただし Action も Function も Observable な interface は実装していないとのことです。
あとは Function とか Action に関するメモが以下。
- Function と Action の違いは call() メソドの戻りのありなし (名前で分かりますね)
- 接尾辞の数値は引数の数
あと、以前も確認してたはずですが BehaviorSubject に関するメモも以下に。
- BehaviorSubject#onNext 呼び出しで subscribe した Observer の onNext が呼ばれる
全部確認してみます
なんとなく読めそうなので以下に諸々を列挙してみます。確認したのは SearchActivity です。
Server という interface 定義
- JsonObject な Observable を戻す find/add なメソド二つ定義
MockServer という Server を実装したクラス定義
- status を判定する isOk メソド
- JsonObject を作って戻すメソド三点 (create, createOk, createError)
- find あるいは add はいずれも Observable.just に JsonObject を渡した戻りを戻す
- 作成は “123” 以外は NG
- 検索は cedric または john 以外は NG
- 検索は 1 秒 wait
Observable.just?
- convert an object or several objects into an Observable that emits that object or those objects
User という data class 定義
- String の id および name
SearchActivity
- Activity 継承して LoaderManager.LoaderCallbacks
実装なクラス定義 - mNameObservable は String な BehaviorSubject
- mUserObservable は JsonObject な BehaviorSubject
onCreate メソド
- setContentView して View の取得
- アダプタ作ってリストにセット
WidgetObservable で editText を見張ります
- 入力文字数が 3 文字まではスルー
- 500ms 待つ
- mNameObservable.onNext 呼び出し
- mNameObservable にて subscribe された関数リテラルが fire される
mNameObservable (その1)
- ログ出力な関数リテラルが subscribe されている
- computation なスレッド? で動作
mNameObservable (その2)
- 以下な関数リテラルが subscribe されている
- ログ出力
- find で戻った JsonObject な Observable で subscribe
- mUserObservable.onNext 呼び出し
- これ、find から戻る Observable で一度関数リテラル呼ばれます
- io なスレッド? にて動作
mNameObservable (その3)
- メインスレッド (おそらく UI Thread) にて動作
- loading を visible にする関数リテラルが subscribe されている
mUserObservable
- メインスレッド (おそらく UI Thread) にて動作
- 渡された JsonObject が OK かどうかでフィルタされる
- OK なら User オブジェクトが作られる
- 以下な関数リテラルが subscribe されている
- 画面部品の操作
- mUser への設定
addFriendButton クリックを見張ります
- onClick なら mServer.addFriend 呼び出し
- addFriend の戻りの Observable で subscribe
- 渡される関数リテラルが以下
- OK/NG な Toast 出力
- テキストボックスの初期化
おわりに
読めるようにはなりましたが、スクラッチから書け、って言われるとちょっと微妙かも。つうかこれって勉強会ネタですね。どっか場所ないかな。