/var/log/messages

debugging with sixth sense

Kotlin-android-example

引き続き以下なリポジトリのソースを確認を。

とりあえず確認しておきたいのは Observable#subscribe に lambda が渡されているらしい件。本来ならば Oberver なナニが渡されないと駄目なはずです。

で、SearchActivity なソースを見てみるに、subscribe に渡されているのはほとんどが lambda な手続きオブジェクト風。

色々調べてみるに

どうも SAM 変換という事をしてくれるらしく

1
2
3
4
5
6
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer param) {
                System.out.println(param);
            }
         }

みたいなソレは以下なカンジにできる模様。

1
        .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 出力
  • テキストボックスの初期化

おわりに

読めるようにはなりましたが、スクラッチから書け、って言われるとちょっと微妙かも。つうかこれって勉強会ネタですね。どっか場所ないかな。

Comments