等待线程之间的realm-java中的数据更新

时间:2016-11-21 10:54:54

标签: java android multithreading realm

我在等待工作线程上的新数据时遇到问题。数据对象在主线程上被复制到领域,但几乎在此之后我需要从工作线程访问该对象,然后工作线程报告现在没有这样的对象(它新打开的领域实例)。我记得有一个方法top_m会阻止执行到下一次更新,但它在较新版本中被删除了。我不能使用更改通知,因为这不是一个Looper线程..

我现在能想到的唯一方法是在一段神奇的时间里睡觉,然后向上帝祈祷它已经更新了,但这种做法是非常不确定的。

有人可以在这里提出建议,我如何确保我当时读取最新数据?

3 个答案:

答案 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。