首先,之前关于SO的类似问题的答案根本没有帮助我。
有时在致电executeTransactionAsync()
时,我无法在onSuccess
方法中获取有关UI线程的刷新数据。
例如,在下面的代码片段中,我有一部分应该将接收到的数据存储到Realm的回调实例。这个回调实例是在UI线程中创建的(当然):
@Override
public void onResponse(final Response<TicketAddItemResult> response, Retrofit retrofit) {
if (!isSuccess()) {
return;
}
Realm realm = Realm.getDefaultInstance();
if (realm.isClosed()) return;
try {
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
RealmTicketsHandler.updateCurrentTicket(realm, response.body().result);
//!!!! Underneath log sometimes from here shows different result than the log in onSuccess with the same query
Log.d(TAG, "execute: (thread) size = " + RealmTicketsHandler.getCurrentTicket(realm).getTicketItems().size() );
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
Realm realm = Realm.getDefaultInstance();
try {
Log.d(TAG, "execute: (onSuccess) size = " + RealmTicketsHandler.getCurrentTicket(realm).getTicketItems().size() );
} finally {
realm.close();
}
postEvent(new TicketRefreshed());
}
});
} finally {
realm.close();
}
}
在方法RealmTicketsHandler.updateCurrentTicket(realm, data)
中,我只是从领域获取对象(Ticket
),创建新对象(TicketItem
),该对象将被添加到RealmList<TicketItem>
,并且该对象将被添加到execute()
。它。
尽管如此,在后台线程中更新Realm后,Realm.Transaction
OnSuccess()
对象的方法记录显示所有内容都已正确添加,但Realm.Transaction.OnSuccess
方法TicketItem
例如,日志有时不会显示预期结果。
Ticket
的对象没有对onSuccess
的任何引用。
有人可以解释我为什么会这样吗?
领域版本: 4.2.0 ,但 4.1.1 <可以体验相同的行为/ p>
注意:在{{1}}中打开Realm只是为了直接显示数据是否在当前线程中刷新。
注意2:我还有一些没有使用领域的loopers的后台线程,但它们可以正常运行,并且可以在UI线程上快速刷新数据。
答案 0 :(得分:1)
这应该是预期的行为,onSuccess()
将保证两件事:
onSuccess()
时,asycn事务开始。 以下案例可以帮助您理解为什么在事务块和onSuccess()
中看到不同的日志。
executeTransactionAsync()
将数据更改为版本1
。1
。2
。2
和3
中获取数据更改。调用了onSuccess()
,您不仅可以看到步骤2中的更改,还可以看到步骤3中的数据更改。因此,您可能会在onSuccess()
回调中看到数据版本3。请注意,onSuccess()
仅保证您将在异步事务中更改数据,但它不会也不会(因为并发很难保证这一点)保证您只看到数据在相应的异步事务中发生更改。稍后更改的数据也可以在onSuccess()
。