Androidで現在地の位置情報を取得し、Realmに保存する処理を書いています。
現在地の情報はLocationServices.FusedLocationApi.requestLocationUpdates
を利用し、PendingIntentでServiceを呼び出し、そこで位置情報を取得しています。
そのIntentService#onHandleIntent
の中でRealm.getDefaultInstance()
を何度も呼んでいるとクラッシュしてしまいます。
Serviceの処理
class LocationBackgroundService : IntentService("LocationBackgroundService") {
override fun onHandleIntent(intent: Intent?) {
intent ?: return
if(!intent.extras.containsKey(FusedLocationProviderApi.KEY_LOCATION_CHANGED)){
return
}
val l = intent.extras.get(FusedLocationProviderApi.KEY_LOCATION_CHANGED) as Location
Realm.getDefaultInstance().executeTransaction { realm ->
realm.createObject(PathRealm::class.java).apply {
date = Date()
latitude = l.latitude
longitude = l.longitude
}
}
RxBus.send(LocationUpdateEvent(l))
}
}
トレース
E/UncaughtException: io.realm.exceptions.RealmError: Unrecoverable error. Too many open files in io_realm_internal_SharedGroup.cpp line 113
at io.realm.internal.SharedGroup.createNativeWithImplicitTransactions(Native Method)
at io.realm.internal.SharedGroup.openSharedGroupOrFail(SharedGroup.java:95)
at io.realm.internal.SharedGroup.<init>(SharedGroup.java:74)
at io.realm.internal.SharedGroupManager.<init>(SharedGroupManager.java:49)
at io.realm.BaseRealm.<init>(BaseRealm.java:81)
at io.realm.Realm.<init>(Realm.java:140)
at io.realm.Realm.createAndValidate(Realm.java:240)
at io.realm.Realm.createInstance(Realm.java:220)
at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:126)
at io.realm.Realm.getDefaultInstance(Realm.java:166)
at jp.shikajiro.hogehoge.services.LocationBackgroundService.onHandleIntent(LocationBackgroundService.kt:29)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.os.HandlerThread.run(HandlerThread.java:61)