модифицированный заголовок не изменяется немедленно

#java #android

#java #Android

Вопрос:

В моем приложении у меня есть spinner пример аббревиатуры некоторого языка (en, az и другие), я хочу установить аббревиатуру выбранного языка в качестве заголовка запроса, и мне это нужно в каждом запросе, поэтому я сохраняю аббревиатуру в общих настройках и получаю аббревиатуру в моем ApiClient классе, каждый раз, когда изменяется выбор счетчика, я изменяю значение аббревиатуры общих настроек, но заголовок устанавливается только при первом выборе языка, и при изменении заголовка выбора счетчика не изменяется

Это мой класс ApiClient

 private static final String BASE_URL = ApiUrls.server_url;

public static Retrofit getClient(Context context)
{

    SharedPrefUtil sharedPrefUtil = new SharedPrefUtil(context);
    String locale = sharedPrefUtil.getSelectedLanguage();

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    httpClient = httpClient.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException
        {
            Request request = chain.request().newBuilder().header("Accept-Language",
                    locale).build();

            return chain.proceed(request);
        }
    });

    Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create()).client(httpClient.build())
            .build();

    return retrofit;
}
  

Это мой метод класса ApiRequester для отправки запроса на сервер

 public static void sendLogin(final Context context, Map<String, String> params,
                             final HttpResponses.onLoginSuccess onLoginSuccess) {

    DialogHelper.ProgressDialog progressDialog = showWaitDialog(context);

    if (hasInternetConnection(context)) {
        params.put("grant_type", "password");
        params.put("client_id", "raymon-client");
        params.put("client_secret", "raymon-secret");

        ApiInterface apiService = ApiClient.getClient(context).create(ApiInterface.class);
        Call<ResponseBody> call = apiService.loginRequest(params);

        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                progressDialog.dismiss();

                //result ok
                if (response.code() == 200)
                {
                    try
                    {
                        onLoginSuccess.loginResponse(JsonSuccessParser.parseLoginResponse
                                (context, response.body().string()));

                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
                else if (response.code() == 403)
                {
                    onLoginSuccess.loginError(response.code());
                }
                else
                {
                    try
                    {
                        JsonErrorParser.parseServerError(context,response.errorBody().string());

                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                progressDialog.dismiss();
                showNoConnectionDialog(context);
            }
        });
    } else {
        progressDialog.dismiss();
        showNoConnectionDialog(context);

    }


}
  

Это мой код для настройки сокращения языка в общих настройках

 private void setUserLocale()
{
    String selected_country = countryCodeAdapter.getItem(country_code_spinner.
            getSelectedItemPosition()).language.abbreviation.toLowerCase();

    LocaleHelper.setLocale(this,selected_country);
}
  

Как я могу немедленно изменить заголовок, когда пользователь меняет положение счетчика?

Ответ №1:

В ApiClient классе вы должны инициализировать locale переменную внутри interceptor методов, чтобы отразить ваши изменения.

Пример)

 private static final String BASE_URL = ApiUrls.server_url;

public static Retrofit getClient(Context context)
{
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    httpClient = httpClient.addInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException
        {
            SharedPrefUtil sharedPrefUtil = new SharedPrefUtil(context);
            String locale = sharedPrefUtil.getSelectedLanguage();
            Request request = chain.request().newBuilder().header("Accept-Language",
                    locale).build();

            return chain.proceed(request);
        }
    });

    Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create()).client(httpClient.build())
            .build();

    return retrofit;
}
  

Однако, если значение постоянно меняется, может оказаться возможным явно передать значение заголовка в качестве аргумента Службе вместо перехватчика.

Пример)

 public interface ApiService {
    Call<...> loginRequest(@Header("Accept-Language") String language, @QueryMap Map<String, String> params);
}

public static void sendLogin(final Context context, Map<String, String> params,
                             final HttpResponses.onLoginSuccess onLoginSuccess) {

    DialogHelper.ProgressDialog progressDialog = showWaitDialog(context);

    if (hasInternetConnection(context)) {
        params.put("grant_type", "password");
        params.put("client_id", "raymon-client");
        params.put("client_secret", "raymon-secret");

        SharedPrefUtil sharedPrefUtil = new SharedPrefUtil(context);
        String locale = sharedPrefUtil.getSelectedLanguage();

        ApiInterface apiService = ApiClient.getClient(context).create(ApiInterface.class);
        Call<ResponseBody> call = apiService.loginRequest(locale, params);

        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                progressDialog.dismiss();

                //result ok
                if (response.code() == 200)
                {
                    try
                    {
                        onLoginSuccess.loginResponse(JsonSuccessParser.parseLoginResponse
                                (context, response.body().string()));

                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
                else if (response.code() == 403)
                {
                    onLoginSuccess.loginError(response.code());
                }
                else
                {
                    try
                    {
                        JsonErrorParser.parseServerError(context,response.errorBody().string());

                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                progressDialog.dismiss();
                showNoConnectionDialog(context);
            }
        });
    } else {
        progressDialog.dismiss();
        showNoConnectionDialog(context);

    }
}