我的项目涉及以下内容:
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")));
}
答案 0 :(得分:3)
向您的异步交易添加Realm.Transaction.OnSuccess()
和Realm.Transaction.OnError()
个回调。调用这些方法后,您就知道事务已完成,您可以刷新UI。
答案 1 :(得分:1)
看起来你有race condition。你做realm.executeTransactionAsync然后立即执行handler.post(this :: refresh); - 无法保证它们按照您希望的顺序执行。