看起来这个错误是由本机代码中的错误引起的,这是由于Realm库 - 基于在librealm-jni.so错误下方的"构建指纹"中看到该短语.我有最新版本的Realm安装 - 1.2.0.
这是错误代码:
Fatal signal 11 (SIGSEGV), code 1, fault addr 0x14c in tid 7837 (ator.app)
Run Code Online (Sandbox Code Playgroud)
这是"构建指纹:"
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
Run Code Online (Sandbox Code Playgroud)
在我打电话notifyDataSetChanged给我之后RecyclerView.Adapter,我缩小了问题的范围,但是在执行之后我的代码没有做任何其他事情.所以我将问题区域进一步缩小到android Looper类的第135行:
Message msg = queue.next(); // might block
Run Code Online (Sandbox Code Playgroud)
我不确定这意味着什么,但我想有人知道内部的内容Realm可能能够解释为什么导致错误的原因Looper.
有关在Realm错误之前发生的更改的更多信息:
在又名"用户" notifyDataSetChanged的RealmChangeListener集合内触发RealmObject.导致更改的事务RealmObject从User's 删除了自定义的又名"Item" RealmList<Item>.我知道这是因为我的代码而发生的唯一事务和操作.这是删除以下内容的代码Item:
RealmSingleton.getUserInstance().executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
UserSingleton.getUser().deleteItem(mItem.getClassId());
}
});
Run Code Online (Sandbox Code Playgroud)
导致错误的Realm代码的确切行是:第149行SharedGroup:
148 void commitAndContinueAsRead() {
149 nativeCommitAndContinueAsRead(nativePtr);
150 }
Run Code Online (Sandbox Code Playgroud)
(我还不是正式境界人)
注意:为了真正回答这个问题,我必须查看完整的代码。毕竟,Realm 会在本机端处理大多数可能的崩溃,并将其作为 Java 的异常抛出,因此您可能会做一些非常错误的事情。:P
猜测:
1.) 您在 UI 线程上使用异步查询与同步写入相结合,从而创建分离的行访问器,然后您尝试根据 ID 删除该访问器,尽管它不是最新版本。
(异步查询不会立即执行,您需要使用 来监听其完成情况RealmChangeListener,但如果将它们与 UI 线程上的同步写入混合,则会强制查询变为同步。)
2.) 您在后台线程上修改了某些内容,但该线程尚未更新 UI 线程上的 RealmResults(使用循环程序运行事件处理),并且您尝试在事务中使用的元素不是最新的,因此它的删除崩溃了。
可能的解决方案:
a.)当您在 UI 线程上时使用executeTransactionAsync()而不是。executeTransaction()
b.) 在你的方法中
UserSingleton.getUser().deleteItem(mItem.getClassId());
Run Code Online (Sandbox Code Playgroud)
不确定UserSingleton是什么,但在删除元素之前,您应该考虑根据事务内的 ID 重新查询它,以获取该元素的最新版本(在这种特殊情况下,UI 线程上的同步事务可能尚未更新,毕竟)
可能的行动方案:
如果您想帮助 Realm,如果此崩溃可以重现,请考虑将项目发送给help[at]realm.io以便他们可以查看并修复它。毕竟,您应该得到 Java 异常,而不是本机崩溃。
| 归档时间: |
|
| 查看次数: |
740 次 |
| 最近记录: |