質問: call.execute().body() ?: return // 取得した結果を Realm に保存する Realm.getDefaultInstance().use { realm -> realm.executeTransaction { realm.copyToRealmOrUpdate(newToken) } } } } ```
回答: ``` val realm = Realm.getDefaultInstance() val token = realm?.where(Token::class.java)?.findFirst() ?: return null (※1) realm.close() ``` の部分で、検索結果が`null`だと`Realm`インスタンスをクローズせずにreturnしてしまっています。 `getDefaultInstance()`したら必ずクローズして下さい。これがおそらく問題の原因です。 次回ここにきて`Realm.getDefaultInstance()`が実行される際、新規の`Realm`インスタンスが作られるのではなくキャッシュされている`Realm`インスタンスが使われることになるのですが、キャッシュされているためいつまでも`Realm`インスタンス作成時点のデータを読み続けてしまいます。ちゃんとクローズを行っていれば、`Realm.getDefaultInstance()`を呼んだ時点で新たに`Realm`インスタンスがつくられ、自動的にその時点の最新のデータを見てくれます。 UIスレッドのように`Looper`が存在するスレッドの場合はイベントループ中に自動的に最新データが読まれるように更新されますが、今回のように`Looper`が存在しないスレッドの場合は新規に`Realm`インスタンスが生成されるタイミングか、特定にAPI呼び出しの場合しか読み取るデータが最新になりません。 ここ以外にもクローズ漏れがあると解決しないので確認してみて下さい。 クローズ漏れがあるかどうかは `Realm#getLocalInstanceCount(RealmConfiguration)`を使って確認することができます。