Более эффективный способ получения объекта LiveData - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть LiveData<List<Storage>> в моей StorageViewModel, я хочу получить этот список в действии, чтобы выполнить get(id) над ним.

Хотя до сих пор я могу достичь только одного способа получить это List<Storage> без того, чтобы оно было null, за исключением того, что этот способ не кажется мне эффективным.

Почему мой второй метод не работает? Я забыл объявить что-то окончательное?

РЕДАКТИРОВАТЬ: мой второй метод получает объект, поступающий из асинхронного вызова в хранилище ROOM, мне требуется какой-то обратный вызов, чтобы получить правильный экземпляр, как кажется. Опять же, возможно, путь мог бы быть более эффективным.


Класс ViewModel

public class StorageViewModel extends AndroidViewModel
{
    StorageRepository _repository;

    LiveData<List<Storage>> _storages;

    public ObservableField<String> storageName = new ObservableField<>("");
    public ObservableField<String> storageLoc = new ObservableField<>("");

    public StorageViewModel(Application application)
    {
        super(application);
        _repository = new StorageRepository(application);
        _storages = _repository.getAllStorages();
    }

    public LiveData<List<Storage>> getStorages()
    {
        return _storages;
    }

    public void addStorage(String storageName, String storageLocation)
    {
        _repository.insert(new Storage(storageName, storageLocation));
    } 
}

Метод работы в классе StorageActivity (хранилища! = Ноль)

void setActivityElements()
{
    int id = (int) getIntent().getExtras().get("storageID");

    storageVM.getStorages().observe(this, new Observer<List<Storage>>() 
    {
        @Override
        public void onChanged(@Nullable final List<Storage> storages) 
        {
            Storage storage = storages.get(id); // storages != null
        }
    });
}

Не работает метод в классе StorageActivity (хранилища == ноль)

void setActivityElements()
{
    int id = (int) getIntent().getExtras().get("storageID");

    List<Storage> storages = storageVM.getStorages().getValue(); // storages == null

    Storage storage = storages.get(id);
}

1 Ответ

0 голосов
/ 07 ноября 2018

Метод работы, который вы опубликовали, правильный. Вам необходимо выполнить проверку обнуляемости наблюдаемой переменной.

Вы должны обновить список с INSIDE класса ViewModel. Это вызовет наблюдателя, которого вы зарегистрировали в классе Activity, и выполнит объявленное вами тело метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...