2016-08-05 100 views
0

mein Projekt zu modifizieren, sind folgende Aktionen:Android: Kann nicht UI aktualisieren, nachdem Datenbank

1) Eine EditText Ansicht (inputText), in dem der Benutzer soll einen Namen

2) Ein Button geben, dass Wenn Sie diese Taste drücken, wird ein Person-Objekt mit dem Namen inputText erstellt und dieses Objekt in der Realm-Datenbank gespeichert. Dann aktualisiert es die textLog, um den neuen Personennamen aufzunehmen.

3) Ein 'TextView' (textLog), der eine Liste aller Namen der Person-Objekte in der Realm-Datenbank anzeigt.

Mein Problem ist, dass das Klicken auf die Schaltfläche das Textprotokoll aktualisiert, bevor es das Objekt Person in der Datenbank speichert. Dies bedeutet, dass der Name der neuen Person erst angezeigt wird, wenn ich erneut auf die Schaltfläche klicke, um ein neueres Person-Objekt zu erstellen. Ich möchte die Benutzeroberfläche aktualisieren nach das Objekt in der Datenbank gespeichert wird, so dass es immer auf dem neuesten Stand ist. Der folgende Code stammt aus meiner Klasse MainActivity. Früher hatte ich Handler handler = new Handler(Looper.getMainLooper()); getan.

// 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"))); 
} 

Antwort

3

Fügen Sie Realm.Transaction.OnSuccess() und Realm.Transaction.OnError() Rückrufe zu Ihrer asynchronen Transaktion hinzu. Wenn diese Methoden aufgerufen werden, wissen Sie, dass die Transaktion abgeschlossen ist und Sie Ihre Benutzeroberfläche aktualisieren können.

+0

Ja, das würde seinen Race Condition beheben, das ist spezifischer als meine Antwort. – EJoshuaS

+0

Danke! Das funktioniert! – novice

1

Es sieht so aus, als ob Sie eine race condition haben. Sie tun realm.executeTransactionAsync und dann sofort handler.post (this :: refresh); - Es gibt keine Garantie, dass sie in der von Ihnen gewünschten Reihenfolge ausgeführt werden.