Skip to content

Commit 82bfde5

Browse files
committed
fix(networking): fix LP-5245 - start ResponseCallback from different thread.
1 parent 033db7e commit 82bfde5

File tree

6 files changed

+58
-46
lines changed

6 files changed

+58
-46
lines changed

AndroidSDK/src/com/leanplum/Leanplum.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1908,15 +1908,14 @@ public static void forceContentUpdate(final VariablesChangedCallback callback) {
19081908
@Override
19091909
public void response(JSONObject response) {
19101910
try {
1911-
JSONObject lastResponse = Request.getLastResponse(response);
1912-
if (lastResponse == null) {
1911+
if (response == null) {
19131912
Log.e("No response received from the server. Please contact us to investigate.");
19141913
} else {
1915-
applyContentInResponse(lastResponse, false);
1916-
if (lastResponse.optBoolean(Constants.Keys.SYNC_INBOX, false)) {
1914+
applyContentInResponse(response, false);
1915+
if (response.optBoolean(Constants.Keys.SYNC_INBOX, false)) {
19171916
LeanplumInbox.getInstance().downloadMessages();
19181917
}
1919-
if (lastResponse.optBoolean(Constants.Keys.LOGGING_ENABLED, false)) {
1918+
if (response.optBoolean(Constants.Keys.LOGGING_ENABLED, false)) {
19201919
Constants.loggingEnabled = true;
19211920
}
19221921
}

AndroidSDK/src/com/leanplum/LeanplumInbox.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,11 @@ void downloadMessages() {
214214
return;
215215
}
216216

217-
Request req = Request.post(Constants.Methods.GET_INBOX_MESSAGES, null);
217+
final Request req = Request.post(Constants.Methods.GET_INBOX_MESSAGES, null);
218218
req.onResponse(new Request.ResponseCallback() {
219219
@Override
220-
public void response(JSONObject responses) {
220+
public void response(JSONObject response) {
221221
try {
222-
JSONObject response = Request.getLastResponse(responses);
223222
if (response == null) {
224223
Log.e("No inbox response received from the server.");
225224
return;

AndroidSDK/src/com/leanplum/LeanplumPushService.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,19 +212,18 @@ public void variablesChanged() {
212212
@Override
213213
public void response(JSONObject response) {
214214
try {
215-
JSONObject getVariablesResponse = Request.getLastResponse(response);
216-
if (getVariablesResponse == null) {
215+
if (response == null) {
217216
Log.e("No response received from the server. Please contact us to " +
218217
"investigate.");
219218
} else {
220219
Map<String, Object> values = JsonConverter.mapFromJson(
221-
getVariablesResponse.optJSONObject(Constants.Keys.VARS));
220+
response.optJSONObject(Constants.Keys.VARS));
222221
Map<String, Object> messages = JsonConverter.mapFromJson(
223-
getVariablesResponse.optJSONObject(Constants.Keys.MESSAGES));
222+
response.optJSONObject(Constants.Keys.MESSAGES));
224223
Map<String, Object> regions = JsonConverter.mapFromJson(
225-
getVariablesResponse.optJSONObject(Constants.Keys.REGIONS));
224+
response.optJSONObject(Constants.Keys.REGIONS));
226225
List<Map<String, Object>> variants = JsonConverter.listFromJson(
227-
getVariablesResponse.optJSONArray(Constants.Keys.VARIANTS));
226+
response.optJSONArray(Constants.Keys.VARIANTS));
228227
if (!Constants.canDownloadContentMidSessionInProduction ||
229228
VarCache.getDiffs().equals(values)) {
230229
values = null;

AndroidSDK/src/com/leanplum/internal/LeanplumEventCallbackManager.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121
package com.leanplum.internal;
2222

23+
import android.os.AsyncTask;
2324
import android.support.annotation.NonNull;
2425

2526
import org.json.JSONObject;
@@ -64,7 +65,7 @@ void addCallbacks(Request request, Request.ResponseCallback responseCallback,
6465
* @param error Exception.
6566
* @param countOfEvents Count of events that we got from database.
6667
*/
67-
void invokeAllCallbacksWithError(@NonNull Exception error, int countOfEvents) {
68+
void invokeAllCallbacksWithError(@NonNull final Exception error, int countOfEvents) {
6869
if (eventCallbacks.size() == 0) {
6970
return;
7071
}
@@ -73,12 +74,20 @@ void invokeAllCallbacksWithError(@NonNull Exception error, int countOfEvents) {
7374
eventCallbacks.entrySet().iterator();
7475
// Loop over all callbacks.
7576
for (; iterator.hasNext(); ) {
76-
Map.Entry<Request, LeanplumEventCallbacks> entry = iterator.next();
77+
final Map.Entry<Request, LeanplumEventCallbacks> entry = iterator.next();
7778
if (entry.getKey().getDataBaseIndex() >= countOfEvents) {
7879
entry.getKey().setDataBaseIndex(entry.getKey().getDataBaseIndex() - countOfEvents);
7980
} else {
8081
if (entry.getValue() != null && entry.getValue().errorCallback != null) {
81-
entry.getValue().errorCallback.error(error);
82+
// Start callback asynchronously, to avoid creation of new Request object from the same
83+
// thread.
84+
Util.executeAsyncTask(false, new AsyncTask<Void, Void, Void>() {
85+
@Override
86+
protected Void doInBackground(Void... params) {
87+
entry.getValue().errorCallback.error(error);
88+
return null;
89+
}
90+
});
8291
}
8392
iterator.remove();
8493
}
@@ -92,7 +101,7 @@ void invokeAllCallbacksWithError(@NonNull Exception error, int countOfEvents) {
92101
* @param responseBody JSONObject withs server response.
93102
* @param countOfEvents Count of events that we got from database.
94103
*/
95-
void invokeAllCallbacksForResponse(@NonNull JSONObject responseBody, int countOfEvents) {
104+
void invokeAllCallbacksForResponse(@NonNull final JSONObject responseBody, int countOfEvents) {
96105
if (eventCallbacks.size() == 0) {
97106
return;
98107
}
@@ -101,12 +110,21 @@ void invokeAllCallbacksForResponse(@NonNull JSONObject responseBody, int countOf
101110
eventCallbacks.entrySet().iterator();
102111
// Loop over all callbacks.
103112
for (; iterator.hasNext(); ) {
104-
Map.Entry<Request, LeanplumEventCallbacks> entry = iterator.next();
113+
final Map.Entry<Request, LeanplumEventCallbacks> entry = iterator.next();
105114
if (entry.getKey().getDataBaseIndex() >= countOfEvents) {
106115
entry.getKey().setDataBaseIndex(entry.getKey().getDataBaseIndex() - countOfEvents);
107116
} else {
108117
if (entry.getValue() != null && entry.getValue().responseCallback != null) {
109-
entry.getValue().responseCallback.response(responseBody);
118+
// Start callback asynchronously, to avoid creation of new Request object from the same
119+
// thread.
120+
Util.executeAsyncTask(false, new AsyncTask<Void, Void, Void>() {
121+
@Override
122+
protected Void doInBackground(Void... params) {
123+
entry.getValue().responseCallback.response(Request.getResponseAt(responseBody,
124+
(int) entry.getKey().getDataBaseIndex()));
125+
return null;
126+
}
127+
});
110128
}
111129
iterator.remove();
112130
}

AndroidSDK/src/com/leanplum/internal/Registration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,13 @@ public void response(final JSONObject response) {
4040
@Override
4141
public void run() {
4242
try {
43-
JSONObject registerResponse = Request.getLastResponse(response);
44-
boolean isSuccess = Request.isResponseSuccess(registerResponse);
43+
boolean isSuccess = Request.isResponseSuccess(response);
4544
if (isSuccess) {
4645
if (callback != null) {
4746
callback.onResponse(true);
4847
}
4948
} else {
50-
Log.e(Request.getResponseError(registerResponse));
49+
Log.e(Request.getResponseError(response));
5150
if (callback != null) {
5251
callback.onResponse(false);
5352
}

AndroidSDK/src/com/leanplum/internal/Request.java

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -506,30 +506,28 @@ private void sendRequests() {
506506

507507
Exception errorException;
508508
if (statusCode >= 200 && statusCode <= 299) {
509-
synchronized (Request.class) {
510-
if (responseBody == null) {
511-
errorException = new Exception("Response JSON is null.");
512-
deleteSentRequests(unsentRequests.size());
513-
parseResponseBody(null, requestsToSend, errorException, unsentRequests.size());
514-
return;
515-
}
516-
517-
Exception exception = null;
518-
// Checks if we received the same number of responses as a number of sent request.
519-
int numResponses = Request.numResponses(responseBody);
520-
if (numResponses != requestsToSend.size()) {
521-
Log.w("Sent " + requestsToSend.size() + " requests but only" +
522-
" received " + numResponses);
523-
}
524-
parseResponseBody(responseBody, requestsToSend, null, unsentRequests.size());
525-
// Clear localErrors list.
526-
localErrors.clear();
509+
if (responseBody == null) {
510+
errorException = new Exception("Response JSON is null.");
527511
deleteSentRequests(unsentRequests.size());
512+
parseResponseBody(null, requestsToSend, errorException, unsentRequests.size());
513+
return;
514+
}
528515

529-
// Send another request if the last request had maximum events per api call.
530-
if (unsentRequests.size() == MAX_EVENTS_PER_API_CALL) {
531-
sendRequests();
532-
}
516+
Exception exception = null;
517+
// Checks if we received the same number of responses as a number of sent request.
518+
int numResponses = Request.numResponses(responseBody);
519+
if (numResponses != requestsToSend.size()) {
520+
Log.w("Sent " + requestsToSend.size() + " requests but only" +
521+
" received " + numResponses);
522+
}
523+
parseResponseBody(responseBody, requestsToSend, null, unsentRequests.size());
524+
// Clear localErrors list.
525+
localErrors.clear();
526+
deleteSentRequests(unsentRequests.size());
527+
528+
// Send another request if the last request had maximum events per api call.
529+
if (unsentRequests.size() == MAX_EVENTS_PER_API_CALL) {
530+
sendRequests();
533531
}
534532
} else {
535533
errorException = new Exception("HTTP error " + statusCode);
@@ -559,7 +557,7 @@ public void sendEventually() {
559557
return;
560558
}
561559

562-
if(LeanplumEventDataManager.willSendErrorLog){
560+
if (LeanplumEventDataManager.willSendErrorLog) {
563561
return;
564562
}
565563

0 commit comments

Comments
 (0)