2016-08-05 22 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を使用することができ、要求は同期になりますが、この場合、あなたはそれのために別のスレッドを作成する気にする必要があります。たとえば、キュ​​ーを使用してasynstartを使用してサービスを作成します。

+0

問題は同期化する方法ではありません... – Jaythaking

+0

私は、エンキューを使用して送信すると、キューなどを作成できないが、同期呼び出しを使用する場合は、あなたの要求を制御できるもの – neustart47

関連する問題