Проблема передачи параметров контекста в Android [Interceptor] - PullRequest
2 голосов
/ 10 июля 2019

Я новичок в разработке под Android и привык разрабатывать на JavaScript.Обычной практикой является реализация перехватчика для добавления заголовка Authorization.В моем текущем приложении не отличается.В этом новом для меня мире SharedPreferences вполне эквивалентно LocalStorage.Но для доступа к первому я должен использовать Context.

. Вот моя проблема: чтобы получить токен, хранящийся в SharedPreferences, находящийся внутри метода intercept, я должен передать Context до Interceptor, но поток до этого имеет много классов: сервис, Retrofit обработчик, okhttp3 клиент, и только тогда Interceptor сам.

Якопать его ненадолго, и я нашел два подхода: пропустите Context через весь этот поток в качестве параметра или создайте класс «Бог» только для того, чтобы сохранить контекст приложения под рукой как метод static.

Пока я использую первый, как вы можете видеть ниже.


public class APIRESTInterceptor implements Interceptor {

    private static final List<String> noAuthRequirements =  new ArrayList<>(Arrays.asList("/api/app/login", "/api/app/token/refresh"));
    private static Context context;

    public APIRESTInterceptor(Context context) {
        setContext(context);
    }

    public static void setContext(Context context) {
        APIRESTInterceptor.context = context;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        String requestPath = request.url().encodedPath();

        if (!noAuthRequirements.contains(requestPath)) {
            String accessToken = SessionUtils.readOfSharedPreferences(context).getAccess();
            request = request.newBuilder().addHeader("Authorization", accessToken).build();
        }

        return  chain.proceed(request);
    }
}

Что я хочу от вас, люди: более простая стратегия, больше похоже на то, что делается в JavaScript для доступа LocalStorage, несмотря на беспорядок там (извините).Подводя итог, я не хочу передавать это как параметр, ни этот "Бог" класс.Есть ли третий подход?

...