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<MessageWithImage>, but images are "null" because
    apps aren't loaded yet.
* MessagesActivity#onUpdateApps
  - Now apps were loaded and cached.
* MessagesActivity.SelectApplicationAndUpdateMessages#onPostExecute
  - receives List<MessageWithImage> from #doInBackgroud with "null" images
-> Messages with "null" images are rendered in the ListView
This commit is contained in:
Jannis Mattheis
2019-02-16 09:59:28 +01:00
parent 67daf8dc2f
commit f713ba4915
2 changed files with 10 additions and 10 deletions

View File

@@ -354,8 +354,7 @@ public class MessagesActivity extends AppCompatActivity
} }
} }
private class SelectApplicationAndUpdateMessages private class SelectApplicationAndUpdateMessages extends AsyncTask<Integer, Void, Integer> {
extends AsyncTask<Integer, Void, List<MessageWithImage>> {
private SelectApplicationAndUpdateMessages(boolean withLoadingSpinner) { private SelectApplicationAndUpdateMessages(boolean withLoadingSpinner) {
if (withLoadingSpinner) { if (withLoadingSpinner) {
@@ -364,13 +363,15 @@ public class MessagesActivity extends AppCompatActivity
} }
@Override @Override
protected List<MessageWithImage> doInBackground(Integer... appIds) { protected Integer doInBackground(Integer... appIds) {
return messages.getOrLoadMore(appIds[0]); Integer appId = first(appIds);
messages.loadMoreIfNotPresent(appId);
return appId;
} }
@Override @Override
protected void onPostExecute(List<MessageWithImage> messageWithImages) { protected void onPostExecute(Integer appId) {
updateMessagesAndStopLoading(messageWithImages); updateMessagesAndStopLoading(messages.get(appId));
} }
} }

View File

@@ -37,12 +37,11 @@ public class MessageFacade {
return get(appId); return get(appId);
} }
public List<MessageWithImage> getOrLoadMore(Integer appId) { public void loadMoreIfNotPresent(Integer appId) {
MessageState state = this.state.state(appId); MessageState state = this.state.state(appId);
if (state.loaded) { if (!state.loaded) {
return get(appId); loadMore(appId);
} }
return loadMore(appId);
} }
public void clear() { public void clear() {