27864


Androidで現在地の位置情報を取得し、Realmに保存する処理を書いています。  
現在地の情報は`LocationServices.FusedLocationApi.requestLocationUpdates`を利用し、PendingIntentでServiceを呼び出し、そこで位置情報を取得しています。

その`IntentService#onHandleIntent`の中で`Realm.getDefaultInstance()`を何度も呼んでいるとクラッシュしてしまいます。

## Serviceの処理

[code]

    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))
        }
    }
    
[/code]

## トレース

[code]

    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)
    
[/code]


CC BY-SA 3.0
2016-07-26T11:59:59.163
27862
2016-07-26T12:59:17.613
2016-07-26T12:59:17.613
5519
354
question
android realm
AndroidのRealmで "io.realm.exceptions.RealmError: Unrecoverable error. Too many open files in io_realm_internal_SharedGroup.cpp line 113"のエラーが発生する


`Realm.getDefaultInstance().executeTransaction〜`とメソッドチェーンで一気に書いているので、Realmのインスタンスが閉じられて（`close()`）いないのが原因です。

下記のように`Realm.getDefaultInstance()`の戻り値（Realmインスタンス）を戻り値で受けて、Realmを使い終わったら必ず`close()`メソッドを呼ぶようにしてください。

`close()`について詳しくはこちら <https://realm.io/jp/docs/java/latest/#realm-3>
を参照してください。

[code]

    override fun onHandleIntent(intent: Intent?) {
        ...
    
        Realm realm = Realm.getDefaultInstance()
        realm.executeTransaction { realm ->
            realm.createObject(PathRealm::class.java).apply {
                date = Date()
                latitude = l.latitude
                longitude = l.longitude
            }
        }
    
        realm.close() // 使い終わったらclose()を呼ぶ
        ...
    }
    
[/code]


CC BY-SA 3.0
2016-07-26T12:57:20.447
27864
2016-07-26T12:57:20.447
5519
27862
answer