Как сделать динамическое получение данных через api retrofit с mvvm android
можете подсказать как сделать мне динамическое получение данных с api с помощью retrofit? Я делал через LiveData, но не получаться, может надо использовать RxJava?
Метод получения данных
private void setSpecialists() {
listSpecialistLoader.setVisibility(View.VISIBLE);
MainActivity.APP_ACTIVITY.viewModel.getGroups().observe(MainActivity.APP_ACTIVITY, new Observer<List<Group>>() {
@Override
public void onChanged(List<Group> groups) {
specialists.clear();
for (Group group : groups) {
specialists.addAll(group.getList());
}
if (specialists.size() == 0)
noHaveDoctorsLabel.setVisibility(View.VISIBLE);
else
noHaveDoctorsLabel.setVisibility(View.GONE);
((TextView) getActivity().findViewById(R.id.count_doctors_label)).setText(String.format("(%s)", specialists.size()));
adapter.notifyDataSetChanged();
listSpecialistLoader.setVisibility(View.GONE);
}
});
}
DataIteractor (типо репозитория)
package ru.galimed.models.data;
import androidx.lifecycle.Observer;
import com.google.gson.Gson;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import ru.galimed.App;
import ru.galimed.MainActivity;
import ru.galimed.models.data.Group;
import rx.schedulers.Schedulers;
public class DataIteractor {
public void getData(final OnDataIteractorCallback callback) {
App.getAppApi()
.getData()
.enqueue(new Callback<Data>() {
@Override
public void onResponse(Call<Data> call, Response<Data> response) {
if (response.isSuccessful() && response.code() != 404 && response.body() != null) {
Data data = response.body();
App.setInfo("data", (new Gson()).toJson(data));
callback.onSuccess(data);
}
}
@Override
public void onFailure(Call<Data> call, Throwable t) {
callback.onFailure(call, t);
}
});
}
public void getGroups(final onDataIteractorCallbackGroup callback) {
App.getAppApi()
.getData()
.enqueue(new Callback<Data>() {
@Override
public void onResponse(Call<Data> call, Response<Data> response) {
if (response.isSuccessful() && response.code() != 404 && response.body() != null) {
List<Group> groups = response.body().getGroups();
callback.onSuccess(groups);
}
}
@Override
public void onFailure(Call<Data> call, Throwable t) {
callback.onFailure(call, t);
}
});
// App.getAppApi().getGroup().subscribeOn(Schedulers.io());
}
public interface OnDataIteractorCallbackDefault {
void onFailure(Call<Data> call, Throwable t);
}
public interface OnDataIteractorCallback extends OnDataIteractorCallbackDefault {
void onSuccess(Data data);
}
public interface onDataIteractorCallbackGroup extends OnDataIteractorCallbackDefault {
void onSuccess(List<Group> group);
}
}
И ViewModel
package ru.galimed.ui.view_model;
import android.app.Application;
import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import java.util.List;
import retrofit2.Call;
import ru.galimed.App;
import ru.galimed.models.data.Data;
import ru.galimed.models.data.DataIteractor;
import ru.galimed.models.data.Group;
import ru.galimed.ui.objects.InternetReceiver;
public class MainViewModel extends ViewModel {
private DataIteractor iteractor = new DataIteractor();
private MutableLiveData<Data> dataLiveData = new MutableLiveData<>();
private MutableLiveData<List<Group>> groupsLiveData = new MutableLiveData<>();
private MutableLiveData<String> errorLiveData = new MutableLiveData<>();
public LiveData<Data> getData() {
if (InternetReceiver.haveInternet) {
iteractor.getData(new DataIteractor.OnDataIteractorCallback() {
@Override
public void onSuccess(Data data) {
dataLiveData.setValue(data);
}
@Override
public void onFailure(Call<Data> call, Throwable t) {
errorLiveData.setValue("");
}
});
} else {
errorLiveData.setValue("У вас нет доступа в интернет!");
}
return dataLiveData;
}
public LiveData<List<Group>> getGroups() {
iteractor.getGroups(new DataIteractor.onDataIteractorCallbackGroup() {
@Override
public void onSuccess(List<Group> group) {
groupsLiveData.setValue(group);
}
@Override
public void onFailure(Call call, Throwable t) {
errorLiveData.setValue(t.getMessage());
}
});
return groupsLiveData;
}
}
Если нужно что то еще пишите.