这个错误似乎是由本机代码中的错误引起的,这是由Realm
库引起的 - 基于错误下面的“构建指纹”中的短语librealm-jni.so
。我安装了最新版本的Realm
- 1.2.0。
这是错误代码:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x14c in tid 7837 (ator.app)
这是“构建指纹:”
Build fingerprint: 'generic/vbox86p/vbox86p:5.0/LRX21M/buildbot11172321:userdebug/test-keys'
26643-26643/? I/DEBUG: Revision: '0'
26643-26643/? I/DEBUG: ABI: 'x86'
26643-26643/? I/DEBUG: pid: 7837, tid: 7837, name: ator.app >>> com.lockedout.app <<<
26643-26643/? I/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x14c
26643-26643/? I/DEBUG: eax 00000148 ebx ffffffff ecx 7470d340 edx 00000002
26643-26643/? I/DEBUG: esi 00000000 edi 00000002
26643-26643/? I/DEBUG: xcs 00000023 xds 0000002b xes 0000002b xfs 00000007 xss 0000002b
26643-26643/? I/DEBUG: eip e2f6d025 ebp ffd3cd58 esp ffd3cd50 flags 00210246
26643-26643/? I/DEBUG: backtrace:
26643-26643/? I/DEBUG: #00 pc 0002a025 /data/app/com.lockedout.app-1/lib/x86/librealm-jni.so
26643-26643/? I/DEBUG: #01 pc 0009c141 /data/app/com.lockedout.app-1/lib/x86/librealm-jni.so
26643-26643/? I/DEBUG: #02 pc 0009c299 /data/app/com.lockedout.app-1/lib/x86/librealm-jni.so
26643-26643/? I/DEBUG: #03 pc 004002d3 /data/dalvik-cache/x86/data@app@com.lockedout.app-1@base.apk@classes.dex
26643-26643/? I/DEBUG: #04 pc 00000002 <unknown>
26643-26643/? I/DEBUG: Tombstone written to: /data/tombstones/tombstone_06
我在notifyDataSetChanged
上调用RecyclerView.Adapter
之后缩小了问题,但我的代码在执行后没有做任何其他事情。所以我将问题区域进一步缩小到android的Looper
类中的第135行:
Message msg = queue.next(); // might block
我不确定这意味着什么,但我想有人知道Realm
的内部结构可能能够在Looper
中找出错误原因的原因。
有关错误发生前Realm
内发生的更改的更多信息:
在notifyDataSetChanged
又名“用户”的RealmChangeListener
集内触发RealmObject
。导致更改的交易从RealmObject
的{{1}}删除了自定义User
又名“项目”。我知道这是因为我的代码而发生的唯一事务和操作。以下是删除RealmList<Item>
的代码:
Item
导致错误的Realm代码的确切行是RealmSingleton.getUserInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
UserSingleton.getUser().deleteItem(mItem.getClassId());
}
});
中的第149行:
SharedGroup
答案 0 :(得分:1)
(我仍然不是官方的Realm人员)
注意:为了真正回答这个问题,我必须查看完整的代码。毕竟,Realm在本机端处理大多数可能的崩溃并将其作为Java的一个例外,所以你可能做错了。 :P
<强>猜测:强>
1。)您在UI线程上使用异步查询和同步写入,因此creating detached row accessors that you then try to delete based on ID despite it not being its latest version。
(异步查询不会立即执行,您需要使用RealmChangeListener
监听它的完成情况,但是如果将它们与UI线程上的同步写入混合使用,则会强制查询变为同步。)
2。)你修改了一些后台线程,它还没有更新UI线程上的RealmResults(用looper运行事件处理),你尝试在事务中使用的元素不是最新,所以删除崩溃。
可能的解决方案:
a。)当您在UI线程上时,请使用executeTransactionAsync()
代替executeTransaction()
。
b。)在你的方法中
UserSingleton.getUser().deleteItem(mItem.getClassId());
不确定UserSingleton
是什么,但在删除元素之前,您应该考虑根据事务中的ID重新查找它以获取元素的最新版本(在这种特定情况下可能尚未更新) ,毕竟是UI线程上的同步事务)
可能的行动方案:
如果您想帮助Realm,如果此崩溃是可重现的,请考虑将项目发送到help[at]realm.io
,以便他们可以查看并修复它。毕竟,您应该获得Java异常,而不是本机崩溃。