如何在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
相关产品推荐
相关产品推荐

