Как из активности вынести запрос retrofit в отдельный класс
Есть несколько запросов которые надо выполнять последовательно, хочу вынести из активити все запросы в отдельные классы и вызывать их когда надо по отдельности и хотелось бы использовать хранилище room, но пока что не понимаю как это сделать
public class NetworkService {
private static NetworkService mInstance;
private static final String BASE_URL = ".....";
private Retrofit mRetrofit;
protected NetworkService() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder client = new OkHttpClient.Builder()
.addInterceptor(interceptor);
mRetrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(client.build())
.build();
}
public static NetworkService getInstance() {
if (mInstance == null) {
mInstance = new NetworkService();
}
return mInstance;
}
public JSONPlaceHolderApi getJSONApi() {
return mRetrofit.create(JSONPlaceHolderApi.class);
}
}
public void UserInfo (){
String androidID = Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
String savedText = sPref.getString(SAVED_TEXT, "");
Log.d(TAG,savedText);
Log.d(TAG,androidID);
NetworkService.getInstance()
.getJSONApi()
.getUserInfo(new UserInfo(savedText,androidID))
.enqueue(new Callback<Example>() {
@Override
public void onResponse(@NonNull Call<Example> call, @NonNull Response<Example> response) {
Example example = response.body();
switch (response.code()) {
case 401: {
Intent intent = new Intent(MainActivity.this, Login.class);
startActivity(intent);
Toast.makeText(getApplicationContext(), "Ваша сессия устарела", Toast.LENGTH_SHORT).show();
}
break;
case 200:{
String FirstName = example.firstName;
save(FirstName,SAVED_First);
String SurName = example.surName;
save(SurName,SAVED_Sur);
String SecondName = example.secondName;
save(SecondName,SAVED_Second);
int num = example.contractData.size();
String [] contract = new String[num];
String [] contractDate = new String[num];
for (int i=0;i<num;i++) {
contract [i] = example.contractData.get(i).contract;
contractDate [i] = example.contractData.get(i).contractDate;
}
String Contract = contract[0];
save(Contract,SAVED_Contract);
String СontractDate = contractDate[0];
save(СontractDate,SAVED_ContractDate);
MainActivity mainActivity = new MainActivity();
mainActivity.FirstName(FirstName);
mainActivity.SurName(SurName);
mainActivity.SecondName(SecondName);
mainActivity.Contract(Contract);
mainActivity.СontractDate(СontractDate);
}
break;
}
}
private void save(String data1,String data) {
sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
SharedPreferences.Editor ed = sPref.edit();
ed.putString(data,data1);
ed.commit();
}
@Override
public void onFailure(@NonNull Call<Example> call, @NonNull Throwable t) {
}
});
}
Ответы (1 шт):
То что вы хотите сделать, делается при помощи класса под названием синглтон. Суть будет такой - в нужный вам момент из активности вызывается этот класс, и его метод который например шлет запрос. Дальше в этом методе вы сохраняете все в room или SharedPreferences. Вот пример создания синглтона:
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton();
}
}
}
return localInstance;
}
}
дальше в этом классе вы создаете метод который будет давать вам доступ к апи из любой активности или фрагмента. У вас этот код находится в классе NetworkService но его можно поместить в один класс, синглтона чтобы не плодить кучу классов. Дальше вы в синглтон добавляете метод получения вашего юзер инфо, и сохраняете нужные данные в бд или настройки приложения. И в итоге вы сможете вызвать метод откуда угодно. Но следует помнить, что при создании метода public void UserInfo (){} в синглтоне, вам нужно будет сохранять данные в памяти телефона, поэтому стоит передавать в этот метод context чтобы был доступ к SharedPreference. Так же метод:
private void save(String data1,String data) {
sPref = getSharedPreferences("MyPref", MODE_PRIVATE);
SharedPreferences.Editor ed = sPref.edit();
ed.putString(data,data1);
ed.commit();
}
можно вынести в синглтон чтобы не засорять активность.