Возможно, вы могли бы создать различные интерфейсы и изменить свой NetworkService для создания адаптера Retrofit в зависимости от интерфейса, который вы хотели бы использовать в разных случаях.
Позвольте мне показать вам идею:
Интерфейсы:
public interface LoginInterface {
@POST(LOGIN)
Call<LoginResponse> login(@Body LoginRequest loginRequest);
}
public interface MovieInterface {
@GET(MOVIE)
Call<MovieResponse> getMovies();
}
Класс NetworkService
Здесь вы можете увидеть Singleton for NetworkService и метод, созданный с помощью этого метода, вы можете создать различные интерфейсы, используя экземпляр singleton:
public class NetworkService {
private final String API_BASE_URL = "";
private static NetworkService INSTANCE = null;
private static Retrofit retrofit;
private OkHttpClient okHttpClient;
private LruCache<Class<?>, Observable<?>> apiObservables;
public NetworkService() {
createInstance();
}
public static NetworkService getInstance() {
if(INSTANCE == null){
return new NetworkService();
}
return INSTANCE;
}
private void createInstance(){
okHttpClient = buildClient();
apiObservables = new LruCache<>(10);
Gson gson = new GsonBuilder()
.setLenient()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
retrofit = new Retrofit.Builder()
.baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(httpClient.build())
.build();
}
public static <T> T create(Class<T> apiClass) {
return retrofit.create(apiClass);
}
private OkHttpClient buildClient() {
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.addInterceptor(loggingInterceptor)
.connectTimeout(100, TimeUnit.SECONDS)
.readTimeout(100, TimeUnit.SECONDS);
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
// Do anything with response here
//if we want to grab a specific cookie or something..
return response;
}
});
builder.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//this is where we will add whatever we want to our request headers.
Request request = chain.request().newBuilder().addHeader("Accept", "application/json").build();
return chain.proceed(request);
}
});
return builder.build();
}
/**
* Method to clear the entire cache of observables
*/
public void clearCache() {
apiObservables.evictAll();
}
}
И затем вы можете использовать его экземпляр, используя ваш измененный NetworService, чтобы создать экземпляр интерфейса, который вы хотите использовать:
Создание экземпляра NetworService:
public class LoginActiviy extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//Instantiation of LoginInterface
LoginInterface loginInterface =
NetworkService.getInstance().create(LoginInterface.class);
//Then we use the method for login
loginInterface.login(/* Handling the callback here*/);
}
}
public class MoviesActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_movies);
//Instantiation of MovieInterface
MovieInterface movieInterface =
NetworkService.getInstance().create(MovieInterface.class);
//Then we use the method for login
loginInterface.getMovies(/* Handling the callback here*/);
}
}
Надеюсь, это поможет вам лучше понять.