Я новичок в разработке под 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
, несмотря на беспорядок там (извините).Подводя итог, я не хочу передавать это как параметр, ни этот "Бог" класс.Есть ли третий подход?