最近弊社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
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent)はそのままだと駄目
-
data :Intent
がnullのcaseがあって落ちた。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
}
-
?
を付けましょう。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
}
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がビルドエラーになる
自動生成されるファイルが残っているためだと思われる