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.
我的项目涉及以下内容:
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.