14
Ноя
2020

Как сделать динамическое получение данных через 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;
}

}

Если нужно что то еще пишите.

Источник: https://ru.stackoverflow.com/questions/1204571/%D0%9A%D0%B0%D0%BA-%D1%81%D0%B4%D0%B5%D0%BB%D0%B0%D1%82%D1%8C-%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%87%D0%B5%D1%80%D0%B5%D0%B7-api-retrofit-%D1%81-mvvm-android

Тебе может это понравится...

Добавить комментарий