gpt4 book ai didi

java - onSuccess 调用后,executeTransactionAsync 不会刷新数据

转载 作者:行者123 更新时间:2023-12-02 11:59:00 26 4
gpt4 key购买 nike

首先,之前对 SO 类似问题的回答根本没有帮助我。

有时调用executeTransactionAsync()时我没有在 onSuccess 中的 UI 线程上获取刷新数据方法。

例如,在下面的代码 fragment 中,我有一部分回调实例应该将接收到的数据存储到 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)中我只是从 Realm 获取对象( Ticket ),创建新对象( TicketItem ),该对象将添加到 RealmList<TicketItem> 中就是这样。

尽管如此,在后台线程中更新 Realm 后,从 execute() 登录方法Realm.Transaction对象向我显示所有内容都已正确添加,但在 OnSuccess() 中方法Realm.Transaction.OnSuccess例如,日志有时不会显示预期结果。

TicketItem 的对象没有任何对 Ticket 的引用.

有人可以解释一下为什么会发生这种情况吗?

Realm 版本: 4.2.0,但在 4.1.1 中也可以体验到相同的行为

注意:onSuccess中打开 Realm 这样做只是为了直接显示当前线程是否有数据刷新。

注 2:我还有一些没有使用 Realm 的循环程序的后台线程,但它们按其应有的方式运行,并且数据在 UI 线程上快速刷新。

最佳答案

这应该是预期的行为,onSuccess() 将保证两件事:

  1. 交易已执行。
  2. 事务中更改的数据已包含在调用 onSuccess() 时启动 asycn 事务的线程上的当前数据库版本中。

下面的案例可能会帮助您理解为什么在事务 block 和 onSuccess() 中看到不同的日志。

  1. UI 线程调用 executeTransactionAsync() 将数据更改为版本 1
  2. 后台线程执行事务,现在后台线程上的 DB 的数据版本为 1
  3. 另一个线程执行事务并将数据更改为版本 2
  4. UI 线程接收到数据库更新事件并获取步骤 23 中的数据更改。调用 onSuccess() 时,您不仅会看到步骤 2 中的更改,还会看到步骤 3 中的数据更改。因此,您可能会在 onSuccess() 中看到数据版本 3 )回调。

请注意,onSuccess() 只能保证您将在异步事务中更改数据,但它不会也不能(嗯,由于并发性很难保证这一点)保证您只看到相应异步事务中的数据更改。之后改变的数据也可以在onSuccess()中看到。

关于java - onSuccess 调用后,executeTransactionAsync 不会刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47396584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com