最近弊社Androidアプリをkotlin化してます。
ファイル数がありすぎる + 機能追加を並行して行っているのでかなりのんびり目で進めていますが、それでも地雷を踏みまくってユーザーに不便をかけてしまっているので、同じ轍を踏まないためにメモを残します。

kotlinのNullSafeな世界を守るために

Convert java to kotlinして気をつけること

onRestoreInstanceState()の復帰objectはすべてnullable対応しておく

  • なんかしらnullになるときがある(もっとちゃんとコード読めば解決する問題のような)
  • これに限らず Bundle にsetData()とかしてるとこは全部チェックしたほうがいいかもしれない
    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)

        this.object = savedInstanceState.getSerializable(KEY_DATA_OBJECT) as? DataObject
}

javaのメソッドを使っているところはnullable対応しておけば間違いない

  • 自動でNonNullに変換されたが、javaなので平気でnullを突っ込んでくる
    • java側のコードをちゃんとチェックすればいいが、そうもいかないときもある
  • onItemClick()などの引数がnullのときがある。
  • もう大概のものに ? つける(落ちるよりはマシだけどよろしくない)

・ onActivityResult()のIntent.getSerializableExtra()

  • Castするときは必ず as? でやりましょう
val data = intent.getSerializableExtra(KEY_DATA) as? HogeData

RxJava1.xだとつらい

  • SingleSubscriber<Void> だと落ちる <Void?> にしよう
hogeSingle.subscribe(object : SingleSubscriber<Void?>() {
                    override fun onSuccess(response: Void?) {
                    })
  • RxJava2ならVoidなんて渡さなくていい。。Completableとか使いたい

おまけ

ConstraintLayoutへの置き換え

  • ConstraintLayoutをAPI Levelの低い端末で見る時は上下の制約をつけておかないとレイアウトが壊れる
  • (計測中)おそらく単純にConstraintLayoutにしても駄目で、階層構造をフラットにすることによって高速化を実現できるとかそんな話な気がする

Databindingを使う

ついでにDatabindingに移行しているときに気づいたこと
- branch切替時にcleanしないとDatabindingに移行したLayoutがビルドエラーになる
- 自動生成されるファイルが残っているためだと思われる

android #coding

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.