在onSuccess调用之后,executeTransactionAsync不刷新数据

时间:2017-11-20 16:23:44

标签: java android realm

首先,之前关于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线程上快速刷新数据。

1 个答案:

答案 0 :(得分:1)

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

  1. 交易已经执行。
  2. 事务中更改的数据已包含在线程的当前数据库版本中,当调用onSuccess() 时,asycn事务开始
  3. 以下案例可以帮助您理解为什么在事务块和onSuccess()中看到不同的日志。

    1. UI线程调用executeTransactionAsync()将数据更改为版本1
    2. 后台线程执行事务,现在后台线程上的数据库具有数据版本1
    3. 另一个线程执行事务并将数据更改为版本2
    4. UI线程收到数据库更新事件,并在步骤23中获取数据更改。调用了onSuccess(),您不仅可以看到步骤2中的更改,还可以看到步骤3中的数据更改。因此,您可能会在onSuccess()回调中看到数据版本3。
    5. 请注意,onSuccess()仅保证您将在异步事务中更改数据,但它不会也不会(因为并发很难保证这一点)保证您只看到数据在相应的异步事务中发生更改。稍后更改的数据也可以在onSuccess()

      中看到