Я уже несколько недель борюсь с этой проблемой. Я отправляю точки геолокации на сервер, используя Retrofit 2.0. Я использую IntentService
, который я звоню каждый раз, когда у меня появляется новое сообщение.Реабилитационный асинхронный запрос на дооснащение
По какой-то причине сервер записывает одну и ту же точку с несколькими моментами создания LOTS дубликатов. Похоже, что когда я вызываю свое обслуживание и он уже активен, он будет запрашивать точки и запускать новый запрос, используя те же точки, которые были запрошены предыдущим запросом. Я также удаляю точку только тогда, когда запрос выполняется. Есть ли способ подождать до выполнения следующей партии очков?
Как я могу подождать, пока вся обрабатываемая точка не будет отправлена на сервер?
private String postAmazonPoints() throws IOException, JSONException {
ArrayList<EntityPoint> points = new ArrayList<>(GenericDAO.getInstance(EntityPoint.class).queryForAll());
if (points.size() == 0) {
return RESULT_OK;
}
if (connectAmazonApi()) {
int pointSize = points.size();
if(pointSize>5){
for(int i = 0; i<pointSize; i+=5){
int end = i+5;
if(end > pointSize){
end = pointSize;
}
paginatePostPoint(points.subList(i, end-1));
}
}else{
paginatePostPoint(points.subList(0, pointSize-1));
}
}
return RESULT_OK;
}
private void paginatePostPoint(final List<EntityPoint> points) throws IOException, JSONException {
EntityPoints mPoints = new EntityPoints(points);
Call<ResponseBody> call = amazonServices.postGeopoints(mPoints);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()) {
JSONObject json;
try {
json = (response != null ? new JSONObject(response.body().string()) : null);
Log.e(TAG, json.toString());
if(RESULT_OK.equals(handleJsonRequest(json))){
deleteDatabasePoints(points);
Log.e(TAG, "Point are correctly posted");
}else{
addFirebaseMsg(json.toString());
}
} catch (JSONException e) {
Log.e(TAG, e.getLocalizedMessage());
} catch (IOException e) {
Log.e(TAG, e.getLocalizedMessage());
}
} else {
try {
addFirebaseMsg(response.errorBody().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
addFirebaseMsg(t.getMessage());
}
});
}
private void addFirebaseMsg(String message){
isConnectedToAmz = false;
Bundle params = new Bundle();
params.putString(FirebaseAnalytics.Param.VALUE, message.substring(0, Math.min(message.length(), 30)));
mFirebaseAnalytics.logEvent(Constants.EVENT_TAG_ERROR, params);
Log.d(TAG, message);
}
private boolean connectAmazonApi() {
if (isConnectedToAmz) {
return true;
}
Call<ResponseBody> call = amazonServices.postAuthenticate(settings.getString("token", ""),settings.getString(MyInstanceIDFireService.FIREBASE_TOKEN, ""), settings.getString("id", ""));
String errMsg = "";
try {
ResponseBody response = call.execute().body();
JSONObject json = (response != null ? new JSONObject(response.string()) : null);
if (json != null) {
Log.e(TAG, "Response: " + json.toString());
RetrofitCreator.setAmazonToken(json.getString("token"));
isConnectedToAmz = true;
return true;
}
Log.w(TAG, "Impossible to connect to Amazon API : " + json);
} catch (JSONException e) {
errMsg = e.getMessage();
} catch (IOException e) {
errMsg = e.getMessage();
}
Log.w(TAG, "Impossible to connect to Amazon API");
Bundle params = new Bundle();
params.putLong(FirebaseAnalytics.Param.VALUE, 1);
params.putString(FirebaseAnalytics.Param.VALUE, errMsg.substring(0, Math.min(errMsg.length(), 30)));
mFirebaseAnalytics.logEvent(Constants.EVENT_AMAZON_UNAVAILABLE, params);
return false;
}
Проблема заключается не в том, как сделать это синхронным, хотя ... – Jaythaking
Я имею в виду, что если вы отправляете использование очереди, вы не можете создать какую-то очередь или что-то в этом роде, но если вы будете использовать синхронный вызов, вы можете создать что может контролировать ваши запросы. – neustart47