2016-08-05 213 views
0

我的项目后,无法更新UI涉及以下内容:安卓:修改数据库

1)EditText视图(inputText),其中假设用户键入一个名称

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

3)A“的TextView”(textLog),显示的境界数据库中的Person对象的所有名称的列表。

我的问题是,点击该按钮刷新文本日志节省人物对象到数据库之前。这意味着只有再次单击按钮才能创建新的Person对象,新人员的姓名才会显示出来。我想让用户界面在之后刷新,将对象保存到数据库,因此它始终处于最新状态。以下代码来自我的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"))); 
} 

回答

3

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

+0

是的,那会解决他的比赛状态,这比我的回答更具体。 – EJoshuaS

+0

谢谢!这工作! – novice

1

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