2016-08-05 2 views
2

Я уже несколько недель борюсь с этой проблемой. Я отправляю точки геолокации на сервер, используя 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; 
} 

ответ

0

Вы можете использовать .execute вместо .enqueue и запрос будет синхронным, но в этом случае вы должны заботиться о создании другого потока для него. Создайте некоторую услугу с помощью asynctask, например, с помощью очереди.

+0

Проблема заключается не в том, как сделать это синхронным, хотя ... – Jaythaking

+0

Я имею в виду, что если вы отправляете использование очереди, вы не можете создать какую-то очередь или что-то в этом роде, но если вы будете использовать синхронный вызов, вы можете создать что может контролировать ваши запросы. – neustart47

Смежные вопросы