我在等待工作线程上的新数据时遇到问题。数据对象在主线程上被复制到领域,但几乎在此之后我需要从工作线程访问该对象,然后工作线程报告现在没有这样的对象(它新打开的领域实例)。我记得有一个方法top_m
会阻止执行到下一次更新,但它在较新版本中被删除了。我不能使用更改通知,因为这不是一个Looper线程..
我现在能想到的唯一方法是在一段神奇的时间里睡觉,然后向上帝祈祷它已经更新了,但这种做法是非常不确定的。
有人可以在这里提出建议,我如何确保我当时读取最新数据?
答案 0 :(得分:1)
可能的黑客攻击是创建一个你最后取消的交易。
realm.beginTransaction(); // blocks while there are other transactions
... // you always see the latest version of the Realm here
realm.cancelTransaction();
如果线程在 UI线程将对象保存到Realm之后启动,则此方法有效。
您也可以尝试以下解决方法:https://stackoverflow.com/a/38839808/2413303(虽然它对等待无效)
答案 1 :(得分:0)
尝试使用QueryListener,它是触发whenewer对象,满足某些条件的更新
答案 2 :(得分:0)
使用 realm.beginTransaction() 和realm.commitTransaction()而不是 realm.executeTransaction(Realm.Transaction)
问题在于 executeTransaction() 会自动处理调用 realm.cancelTransaction() 以防万一抛出异常,而另一个替代方案通常忽略try-catch。
是的,您应该在不会最终提交的交易上调用取消。
例如,在后台线程上:
// SAY NO TO THIS
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction(); // NO
realm.copyToRealm(dog)
realm.commitTransaction(); // NO NO NO NO NO
// YOU NEED TO CLOSE THE REALM
// ----------------------
// SAY YES TO THIS
Realm realm = null;
try { // I could use try-with-resources here
realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
realm.insertOrUpdate(dog);
}
});
} finally {
if(realm != null) {
realm.close();
}
}
// OR IN SHORT (Retrolambda)
try(Realm realmInstance = Realm.getDefaultInstance()) {
realmInstance.executeTransaction((realm) -> realm.insertOrUpdate(dog));
}
这个问题是在后台线程上,即使线程执行结束也没有关闭的开放式Realm实例非常昂贵,并且可能导致奇怪的错误。因此,当在finally块中执行时,建议在后台线程上关闭Realm。这包括IntentServices。