如何在删除文件之前关闭()Realm的所有实例

时间:2017-11-14 02:10:48

标签: android realm realm-java

我在尝试删除java.lang.IllegalStateException文件时获得了realm

  

java.lang.IllegalStateException:不允许删除与打开的Realm关联的文件。记得在删除文件之前关闭()Realm的所有实例:/data/data/com.mypackage.name/files/filename.realm

我使用了executeTransactionAsyncexecuteTransaction方法。所以,我想在删除整个async文件之前,有一个实例realm无法关闭它。

如何在不收到此异常的情况下关闭realm的所有实例或如何删除realm文件?

2 个答案:

答案 0 :(得分:1)

如果没有更多细节,很难回答,因为开放实例可能来自很多地方。也许下面的两个链接可以为您使用Realm实例提供一些指导:

请参阅https://realm.io/docs/java/latest/#closing-realmshttps://realm.io/docs/java/latest/#realm-instance-lifecycle

答案 1 :(得分:0)

好的,所以这并不能真正解决问题(但它至少会尝试在主线程上关闭Realms),但可以让您调试打开未关闭Realm的原因和位置。

只需获取TraceableRealm.getInstance(realmConfig, "I needed it for that tiny query")的一个实例并关闭TraceableRealm的实例,而不只是Realm

realmIndex内,您将得到一个仍在打开的Realm列表以及线程和它们存在的原因...

class TraceableRealm(
        val realm: Realm,
        val thread: String,
        val purpose: String
): Closeable
{
    companion object {
        val realmIndex = mutableListOf<TraceableRealm>()

        fun getInstance(config: RealmConfiguration, purpose: String): TraceableRealm {
            val newRealm = TraceableRealm(Realm.getInstance(config), Thread.currentThread().name, purpose)
            realmIndex.add(newRealm)
            realmIndex.removeAll { !it.isOpen }
            return newRealm
        }

        fun killZombies() {
            runUI {
                realmIndex.filter { it.isOpen && it.thread == Thread.currentThread().name }.forEach {
                    try {
                        it.close()
                    } catch (ex: Exception) {
                        Timber.d("Problem removing zombie realm: $it")
                    }
                }
                realmIndex.removeAll { !it.isOpen }
                realmIndex.forEach {
                    Timber.d("Couldn't close realm: $it")
                }
            }
        }
    }

    var isOpen = true

    override fun toString(): String {
        return "$purpose in $thread open=$isOpen"
    }

    override fun close() {
        realm.close()
        isOpen = false
    }
}