Android: 修改数据库后无法更新 UI

Android: Can't update UI after modifying database

我的项目涉及以下内容:

1) 一个 EditText 视图 (inputText),用户应该在其中键入名称

2) 一个 Button,当按下时,创建一个名称在 inputText 中的 Person 对象,并将该对象保存到领域数据库中。然后它刷新 textLog 以包含新人的姓名。

3) 一个 'TextView' (textLog),它显示领域数据库中所有 Person 对象的名称列表。

我的问题是,在将人员对象保存到数据库之前,单击按钮会刷新文本日志。这意味着在我再次单击按钮创建一个新的 Person 对象之前,新人的名字不会出现。我希望 UI 在 对象保存到数据库后刷新 ,因此它始终是最新的。以下代码来自我的 MainActivity class。之前我做过 Handler handler = new Handler(Looper.getMainLooper());.

// called when button is clicked
private void submit(View view)
{
    final String input = inputText.getText()
                                  .toString()
                                  .trim();
    // asynchronous transaction
    realm.executeTransactionAsync(realm -> {
        realm.copyToRealm(new Person(input));
        handler.post(this::refresh);
    });
}

private void refresh()
{
    textLog.setText(realm.where(Person.class)
                         .findAll()
                         .stream()
                         .map(Person::getName)
                         .collect(Collectors.joining("\n")));
}

看起来你有一个 race condition。你做 realm.executeTransactionAsync 然后立即做 handler.post(this::refresh); - 不能保证它们会按照您希望的顺序执行。

向您的异步事务添加 Realm.Transaction.OnSuccess()Realm.Transaction.OnError() 回调。调用这些方法时,您知道交易已完成,您可以刷新 UI.