【问题标题】:More efficient way getting LiveData object获取 LiveData 对象的更有效方法
【发布时间】:2018-11-01 13:21:55
【问题描述】:

我的 StorageViewModel 中有一个 LiveData<List<Storage>>,我想在活动中获取此列表,以便对其执行 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 类中的工作方法(storages != null)

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 类中的方法无效(存储 == null)

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

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

    Storage storage = storages.get(id);
}

【问题讨论】:

    标签: android observable android-architecture-components android-livedata


    【解决方案1】:

    您发布的工作方法是正确的。您需要检查可观察变量的可空性。

    您必须从 INSIDE ViewModel 类更新列表。这将触发您在Activity 类中注册的观察者并执行您声明的方法体。

    【讨论】:

    • 那么简而言之,没有更短的方法来执行可空性检查?
    • 不,应该是这样的。它们使您可以将null 设置为您拥有的LiveDatas 的值。您可以使用 Kotlin 并这样做:storages?.let { /*code here*/ }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2015-08-11
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多