You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Realm事务的onSuccess回调中关闭Activity?

问题根因
  • executeTransactionAsync的回调执行线程和发起调用的Realm实例绑定的线程一致:你当前调用方法的realmThread是后台工作线程,onSuccess回调也会执行在该后台线程,而Android要求所有Activity生命周期操作(包括finish())必须在主线程执行,后台线程调用finish()不会生效,甚至可能抛出的线程异常被静默吞掉。
  • 若realmThread对应的工作线程没有绑定Looper,onSuccess回调会直接不触发,自然不会执行finish()逻辑。
解决方案

方案1:使用主线程Realm实例执行异步事务

直接在当前Activity的主线程获取Realm实例调用异步事务,此时onSuccess会自动回调到主线程,直接调用finish()即可生效:

// 在Activity onCreate中初始化主线程Realm实例
val mainThreadRealm = Realm.getDefaultInstance()

addButton.setOnClickListener {
  val newObject = MyObject()
  newObject.name = "Name"
  
  mainThreadRealm.executeTransactionAsync(
    { transaction -> transaction.insert(newObject) },
    { _ -> finish() }
  )
}

// 对应在Activity onDestroy中关闭Realm避免内存泄漏
override fun onDestroy() {
    super.onDestroy()
    mainThreadRealm.close()
}

方案2:回调中手动切换到主线程执行finish

如果必须保留realmThread对应的后台线程Realm实例,只需要在onSuccess里把finish()逻辑抛到主线程执行即可:

addButton.setOnClickListener {
  val newObject = MyObject()
  newObject.name = "Name"
  
  realmThread.executeTransactionAsync(
    { transaction -> transaction.insert(newObject) },
    { _ -> 
        // 主动切到主线程执行Activity操作
        runOnUiThread { finish() }
    }
  )
}
补充注意事项
  • 可以在onSuccess回调中增加本地日志打印,确认回调是否正常触发,排除事务执行异常没有走到成功回调的情况。
  • 所有Realm实例使用完毕后必须调用close()回收,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Adrian Garcia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:06:02