2017-12-25 20 views
0

Retrofit2を使用して、マップ上で選択された特定の場所の情報を取得し、アプリケーションのUIに表示する方法はgetLabelFromServerです。最後のAPI呼び出しに基づいてUIを更新し、以前の呼び出しをキャンセルするように複数のRetrofit呼び出しを管理する

サーバーから情報を受信するのを待っている間にユーザーが選択した場所を変更する可能性があるため、受信した情報の前回の呼び出しをキャンセルし、新しい場所の情報を受け取り、新しい呼び出しの応答時に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(); 
         } 
        } 
       } 
    ); 
} 
+0

check call.isExecuted();メソッドを呼び出してから次の要求を出します。 リクエストが完了した場合はtrueを返します。 –

答えて

0

check call.isExecuted();メソッドを呼び出してから次の要求を出します。 リクエストが完了した場合はtrueを返します。 それ以外の場合は完了していませんので、call.cancel()メソッドを呼び出してリクエストをキャンセルし、再度リクエストを開始してください。

+0

あなたは 'call.isExecuted()'が現時点でtrueなら 'call.cancel()'を呼び出すとどうなるでしょうか?例外が発生するか、問題なく実行されますか? – VSB

関連する問題