Avoid race conditions when updating the UI from events.

This commit is contained in:
akwizgran
2016-10-17 10:54:00 +01:00
parent 50a70f7649
commit 2140a290e4
14 changed files with 239 additions and 93 deletions

View File

@@ -29,7 +29,7 @@ abstract class InvitationsActivity extends BriarActivity
protected static final Logger LOG =
Logger.getLogger(InvitationsActivity.class.getName());
private InvitationAdapter adapter;
protected InvitationAdapter adapter;
private BriarRecyclerView list;
@Inject
@@ -84,6 +84,7 @@ abstract class InvitationsActivity extends BriarActivity
Toast.makeText(this, res, LENGTH_SHORT).show();
// remove item and finish if it was the last
adapter.incrementRevision();
adapter.remove(item);
if (adapter.getItemCount() == 0) {
supportFinishAfterTransition();
@@ -102,7 +103,7 @@ abstract class InvitationsActivity extends BriarActivity
abstract protected int getDeclineRes();
protected void displayInvitations(
protected void displayInvitations(final int revision,
final Collection<InvitationItem> invitations, final boolean clear) {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
@@ -110,9 +111,13 @@ abstract class InvitationsActivity extends BriarActivity
if (invitations.isEmpty()) {
LOG.info("No more invitations available, finishing");
finish();
} else {
} else if (revision == adapter.getRevision()) {
adapter.incrementRevision();
if (clear) adapter.setItems(invitations);
else adapter.addAll(invitations);
} else {
LOG.info("Concurrent update, reloading");
loadInvitations(clear);
}
}
});

View File

@@ -70,6 +70,7 @@ public class InvitationsBlogActivity extends InvitationsActivity {
@Override
protected void loadInvitations(final boolean clear) {
final int revision = adapter.getRevision();
runOnDbThread(new Runnable() {
@Override
public void run() {
@@ -80,7 +81,7 @@ public class InvitationsBlogActivity extends InvitationsActivity {
long duration = System.currentTimeMillis() - now;
if (LOG.isLoggable(INFO))
LOG.info("Load took " + duration + " ms");
displayInvitations(invitations, clear);
displayInvitations(revision, invitations, clear);
} catch (DbException e) {
if (LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e);

View File

@@ -70,6 +70,7 @@ public class InvitationsForumActivity extends InvitationsActivity {
@Override
protected void loadInvitations(final boolean clear) {
final int revision = adapter.getRevision();
runOnDbThread(new Runnable() {
@Override
public void run() {
@@ -80,7 +81,7 @@ public class InvitationsForumActivity extends InvitationsActivity {
long duration = System.currentTimeMillis() - now;
if (LOG.isLoggable(INFO))
LOG.info("Load took " + duration + " ms");
displayInvitations(invitations, clear);
displayInvitations(revision, invitations, clear);
} catch (DbException e) {
if (LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e);