Bạn vẫn có thể (và phải) sử dụng Trình chặn.
Tất cả những gì bạn cần là một Kiến trúc nhỏ.
Trước tiên hãy tạo trình trợ giúp cung cấp các tiêu đề cần thiết.
public class AnalyticsHeader {
private String analyticsHeaderName;
private String analyticsHeaderValue;
public void setHeaderValue(String header) {
this.analyticsHeaderValue = header;
}
public void setHeaderName(String header) {
this.analyticsHeaderName = header;
}
public String getHeaderName() {
return analyticsHeaderName;
}
public String getHeaderValue() {
return analyticsHeaderValue;
}
}
Giữ một thể hiện của lớp này ở một nơi dễ tiếp cận bên trong ứng dụng của bạn, ví dụ như MainActivity của chúng tôi ứng dụng (hoặc thậm chí tốt hơn, sử dụng Dependency Injection)
Bây giờ, khi tạo của Interceptor chỉ cần vượt qua trường hợp của các AnalyticsHeader vào Interceptor:
public static final class AnalyticsInterceptor implements Interceptor {
private final AnalyticsHeader header;
public AnalyticsInterceptor(AnalyticsHeader header) {
this.header = header;
}
@Override
public Response intercept(Chain chain) throws IOException {
final Request original = chain.request();
Response response;
if (header.getHeader() != null) {
Request request = original.newBuilder()
.header(header.getHeaderName(), header.getHeaderValue())
.method(original.method(), original.body())
.build();
response = chain.proceed(request);
} else {
response = chain.proceed(original);
}
return response;
}
}
Và sau đó ...
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(new AnalyticsInterceptor(CentralPlaceInApp.getAnalyticsHeader());
...
retrofit = new Retrofit.Builder()
.baseUrl(config.getRestUrl())
.client(builder.build())
.build();
Bây giờ, bạn có thể thay đổi giá trị của tiêu đề bất cứ lúc nào trong thời gian chạy ứng dụng bằng cách sử dụng CentralPlaceInApp.getAnalyticsHeader().setHeaderValue(CurrentActivity.class.getSimpleName());