管理多个Retrofit调用,以便根据上次API调用更新UI并取消之前的调用

时间:2017-12-25 07:39:17

标签: android google-maps concurrency retrofit2

我使用Retrofit2获取在地图上选择的指定位置的信息,并通过调用方法getLabelFromServer将其显示在我的应用程序UI上,如下所示。

由于用户可能在等待从服务器接收信息时更改所选位置,因此我应取消之前对所接收信息的呼叫,并等待接收新位置信息并在响应新呼叫时更新UI。 请注意,之前的通话不应更新用户界面,因为它会显示之前用户现在未选择的位置信息。 如何更改下面的代码来实现这一点(我应该注意,每次在地图上选择新位置时,我都会在UI线程上调用此方法。)

 private void getLabelFromServer(Context ctx, GeoPoint geoPoint) {
    MapServiceGenerator serviceGenerator = MapServiceGenerator.getInstance(ctx, null);
    Call<JsonObject> call = serviceGenerator.getGeoCodeApi().getAddress(geoPoint.getLatitude() + "," + geoPoint.getLongitude());
    call.enqueue(new Callback<JsonObject>() {
                     @Override
                     public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                         JsonObject result = response.body();
                         String positionLabel = MapUtils.generateLabelFromJSON(result);
                         tvLabel.setText(positionLabel);
                     }

                     @Override
                     public void onFailure(Call<JsonObject> call, Throwable t) {
                         if (t != null) {
                             t.printStackTrace();
                         } 
                     }
                 }
    );
}

1 个答案:

答案 0 :(得分:0)

check call.isExecuted();在给出下一个请求之前的方法。 如果返回true,则表示您的请求已完成。 否则,它还没有完成,所以调用call.cancel()方法取消请求并重新启动您的请求