Зачем модернизировать возвращающий Null 'LiveData' даже после правильного задания ненулевого значения? - PullRequest
0 голосов
/ 16 января 2020

Я получил ответ правильно, правильно установил значение LiveData (подтвердилось печатью значения на консоли после установки значения для живых данных). Но когда я пытался напечатать ту же самую вещь перед «возвратом», это выдает мне NullPointerException.

public class ProjectRepository {

private ProjectRepository instance;
Context context;
public ProjectRepository(Context context) {
  this.context=context;
}
private MutableLiveData<List<PojoDivision>> data = new MutableLiveData<>();
public LiveData<List<PojoDivision>> getDivisionList() {
    ((RetrofitConfiguration)context).getDivisionRestApiWithAuthentication().getDivisionList().enqueue(new Callback<List<PojoDivision>>() {
        @Override
        public void onResponse(Call<List<PojoDivision>> call, Response<List<PojoDivision>> response) {

            if (response.isSuccessful()) {
                System.out.println(response.body().get(4).getName()); // this is printing

                data.setValue(response.body());
                System.out.println(data.getValue().get(4).getName()); // this is printing
            }
        }

        @Override
        public void onFailure(Call<List<PojoDivision>> call, Throwable t) {
            Log.d(TAG, t.getMessage());
        }
    });
    /*
    following code is not printing with nullPointerException
    java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference
     */
    System.out.println(data.getValue().get(4).getName());
    return data;
}

}

1 Ответ

1 голос
/ 17 января 2020

Поскольку вы используете объект LiveData на уровне класса для своего класса репозитория, вашему методу не нужно ничего возвращать. Вместо этого он несет ответственность за обновление этого объекта LiveData.

public class ProjectRepository {
    private static final String TAG = "ProjectRepository";

    private ProjectRepository instance;
    Context context;

    public ProjectRepository(Context context) {
        this.context = context;
    }

    public MutableLiveData<List<PojoDivision>> data = new MutableLiveData<>();

    public void getDivisionList() {
        ((RetrofitConfiguration) context).getDivisionRestApiWithAuthentication().getDivisionList().enqueue(new Callback<List<PojoDivision>>() {
            @Override
            public void onResponse(Call<List<PojoDivision>> call, Response<List<PojoDivision>> response) {

                if (response.isSuccessful()) {
                    data.postValue(response.body());
                }
            }

            @Override
            public void onFailure(Call<List<PojoDivision>> call, Throwable t) {
                Log.d(TAG, t.getMessage());
            }
        });
    }

}

Клиенты этого класса должны будут 1) наблюдать объект LiveData и 2) вызывать метод getDivisionList() для запуска обновления:

class MyFragment extends Fragment {

    private ProjectRepository repository;

    private void setRepository() {
        Context context = getContext();
        if (context == null) return;
        repository = new ProjectRepository(context);
    }

    public void observeData() {
        repository.data.observe(this, new Observer<List<PojoDivision>>() {
            @Override
            public void onChanged(List<PojoDivision> pojoDivisions) {
                // do something with updated data
            }
        });
    }

    public void triggerUpdate() {
        repository.getDivisionList();
    }
}
...