From f713ba491504d72aa0d8f6ecb730b7b91a34d275 Mon Sep 17 00:00:00 2001 From: Jannis Mattheis Date: Sat, 16 Feb 2019 09:59:28 +0100 Subject: [PATCH] Fix race condition while loading messages Images didn't load correctly when the following scenario occurred: * ApplicationHolder#request * MessagesActivity.SelectApplicationAndUpdateMessages#execute * MessagesActivity.SelectApplicationAndUpdateMessages#doInBackground - method returns List, but images are "null" because apps aren't loaded yet. * MessagesActivity#onUpdateApps - Now apps were loaded and cached. * MessagesActivity.SelectApplicationAndUpdateMessages#onPostExecute - receives List from #doInBackgroud with "null" images -> Messages with "null" images are rendered in the ListView --- .../github/gotify/messages/MessagesActivity.java | 13 +++++++------ .../gotify/messages/provider/MessageFacade.java | 7 +++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/github/gotify/messages/MessagesActivity.java b/app/src/main/java/com/github/gotify/messages/MessagesActivity.java index a0e2f09..99742d4 100644 --- a/app/src/main/java/com/github/gotify/messages/MessagesActivity.java +++ b/app/src/main/java/com/github/gotify/messages/MessagesActivity.java @@ -354,8 +354,7 @@ public class MessagesActivity extends AppCompatActivity } } - private class SelectApplicationAndUpdateMessages - extends AsyncTask> { + private class SelectApplicationAndUpdateMessages extends AsyncTask { private SelectApplicationAndUpdateMessages(boolean withLoadingSpinner) { if (withLoadingSpinner) { @@ -364,13 +363,15 @@ public class MessagesActivity extends AppCompatActivity } @Override - protected List doInBackground(Integer... appIds) { - return messages.getOrLoadMore(appIds[0]); + protected Integer doInBackground(Integer... appIds) { + Integer appId = first(appIds); + messages.loadMoreIfNotPresent(appId); + return appId; } @Override - protected void onPostExecute(List messageWithImages) { - updateMessagesAndStopLoading(messageWithImages); + protected void onPostExecute(Integer appId) { + updateMessagesAndStopLoading(messages.get(appId)); } } diff --git a/app/src/main/java/com/github/gotify/messages/provider/MessageFacade.java b/app/src/main/java/com/github/gotify/messages/provider/MessageFacade.java index 9356c9f..f3eaa2d 100644 --- a/app/src/main/java/com/github/gotify/messages/provider/MessageFacade.java +++ b/app/src/main/java/com/github/gotify/messages/provider/MessageFacade.java @@ -37,12 +37,11 @@ public class MessageFacade { return get(appId); } - public List getOrLoadMore(Integer appId) { + public void loadMoreIfNotPresent(Integer appId) { MessageState state = this.state.state(appId); - if (state.loaded) { - return get(appId); + if (!state.loaded) { + loadMore(appId); } - return loadMore(appId); } public void clear() {