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:
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user