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

时间:2016-08-05 15:47:25

标签: android multithreading user-interface realm updating

我的项目涉及以下内容:

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

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

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

我的问题是,在将人物对象保存到数据库之前,单击该按钮会刷新文本日志。这意味着在我再次单击该按钮以创建较新的Person对象之前,新人的姓名不会显示。我希望UI在对象保存到数据库后刷新,因此它始终是最新的。以下代码来自我的MainActivity课程。早些时候我做过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")));
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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