Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 线程安全异步改造请求_Android_Multithreading_Retrofit2 - Fatal编程技术网

Android 线程安全异步改造请求

Android 线程安全异步改造请求,android,multithreading,retrofit2,Android,Multithreading,Retrofit2,我为这个问题挣扎了几个星期。我正在使用改型2.0将地理定位点发布到服务器。我正在使用一个IntentService,每当我有新的观点要发表时,我就会调用它 出于某种原因,服务器多次记录同一点,创建大量重复项。似乎当我调用我的服务并且它已经处于活动状态时,它将查询点并使用前一个请求所查询的相同点启动新请求。我还将仅在请求成功时删除该点。有没有办法等到执行下一批点 如何等待所有已处理的点发送到服务器 private String postAmazonPoints() throws IOExcepti

我为这个问题挣扎了几个星期。我正在使用改型2.0将地理定位点发布到服务器。我正在使用一个
IntentService
,每当我有新的观点要发表时,我就会调用它

出于某种原因,服务器多次记录同一点,创建大量重复项。似乎当我调用我的服务并且它已经处于活动状态时,它将查询点并使用前一个请求所查询的相同点启动新请求。我还将仅在请求成功时删除该点。有没有办法等到执行下一批点

如何等待所有已处理的点发送到服务器

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;
}
private String postAmazonPoints()抛出IOException、JSONException{
ArrayList points=newArrayList(GenericDAO.getInstance(EntityPoint.class).queryForAll());
如果(points.size()==0){
返回结果_OK;
}
if(connectAmazonApi()){
int pointSize=points.size();
如果(点大小>5){
for(int i=0;i pointSize){
结束=点大小;
}
分页后点(点。子列表(i,end-1));
}
}否则{
分页后点(points.subList(0,pointSize-1));
}
}
返回结果_OK;
}
private void paginatePostPoint(最终列表点)抛出IOException、jsoneexception{
EntityPoints mPoints=新的EntityPoints(点);
Call Call=amazonServices.postGeopoints(mPoints);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
if(response.issusccessful()){
JSONObject json;
试一试{
json=(response!=null?新的JSONObject(response.body().string()):null);
Log.e(TAG,json.toString());
if(RESULT_OK.equals(handleJsonRequest(json))){
删除数据库点(点);
Log.e(标记“正确张贴点”);
}否则{
addFirebaseMsg(json.toString());
}
}捕获(JSONException e){
Log.e(TAG,e.getLocalizedMessage());
}捕获(IOE异常){
Log.e(TAG,e.getLocalizedMessage());
}
}否则{
试一试{
addFirebaseMsg(response.errorBody().string());
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
addFirebaseMsg(t.getMessage());
}
});
}
私有void addfirebasemg(字符串消息){
isConnectedToAmz=false;
Bundle params=新Bundle();
params.putString(FirebaseAnalytics.Param.VALUE,message.substring(0,Math.min(message.length(),30));
mFirebaseAnalytics.logEvent(常量.EVENT_标记_错误,参数);
Log.d(标签、消息);
}
私有布尔连接amazonapi(){
如果(已连接到TOAMZ){
返回true;
}
Call Call=amazonServices.postAuthenticate(settings.getString(“token”),settings.getString(MyInstanceIDFireService.FIREBASE_token,”),settings.getString(“id”,“”);
字符串errMsg=“”;
试一试{
ResponseBody response=call.execute().body();
JSONObject json=(response!=null?新JSONObject(response.string()):null);
if(json!=null){
Log.e(标记,“Response:+json.toString());
setAmazonToken(json.getString(“token”);
isConnectedToAmz=true;
返回true;
}
w(标记“不可能连接到AmazonAPI:+json”);
}捕获(JSONException e){
errMsg=e.getMessage();
}捕获(IOE异常){
errMsg=e.getMessage();
}
Log.w(标签,“不可能连接到AmazonAPI”);
Bundle params=新Bundle();
参数putLong(FirebaseAnalytics.Param.VALUE,1);
putString(FirebaseAnalytics.Param.VALUE,errMsg.substring(0,Math.min(errMsg.length(),30));
mFirebaseAnalytics.logEvent(常量.EVENT\u不可用,参数);
返回false;
}

您可以使用
.execute
而不是
。排队
和请求将是同步的,但在这种情况下,您应该注意为它创建另一个线程。使用asynСtask创建一些服务,例如使用queue。

我的意思是,如果使用enqueue发送,则无法创建一些队列或类似的内容,但如果使用同步调用,则可以创建一些可以控制请求的内容。