我正在使用将MVVM
模式与RxJava
一起使用的应用程序。架构如下:
这是我第一次使用此模式,并且我不确定在数据发生更改时更新ViewModel
(因此是相应的View
)的最佳方法是,该应用程序的另一个组件。
例如:假设我们有一个Activity
,显示我关注的用户列表(如社交应用程序),则从该列表中选择一个用户,然后在另一个Activity
中打开其个人资料。现在,从第二个Activity
开始,我决定取消关注该用户,当我按下“后退”按钮返回第一个Activity
时,我希望列表自动更新(删除相应的用户,显然没有必须重新下载所有数据)。
问题在于两个Activity
具有两个不同的ViewModel
。我如何使第二个Activity
所做的更改影响第一个ViewModel
? Repository
负责将更改通知第一Activity
吗?
startActivityForResult
ViewModel
中注入第一个Activity
非常感谢!
答案 0 :(得分:3)
我决定取消关注该用户,并且当我按下“后退”按钮返回到第一个活动时,我希望列表自动更新(删除相应的用户,显然不必重新下载所有数据)。 / p>
问题在于两个Activity具有两个不同的ViewModel。
我以为您有一个包含“模型”(本地数据源)的存储库,该存储库能够公开LiveData<*>
,不是吗?
在这种情况下,您需要做的是
@Dao
public interface ItemDao {
@Query("SELECT * FROM ITEMS")
LiveData<List<Item>> getItemsWithChanges();
@Query("SELECT * FROM ITEMS WHERE ID = :id")
LiveData<List<Item>> getItemWithChanges(String id);
}
现在您的存储库可以从DAO返回LiveData:
public class MyRepository {
public LiveData<List<Item>> getItems() {
// either handle "fetch if needed" here, or with NetworkBoundResource
return itemDao.getItemsWithChanges();
}
}
您进入了ViewModel:
public class MyViewModel extends ViewModel {
private final LiveData<List<Item>> items;
public MyViewModel(MyRepository repository) {
this.items = repository.getItems();
}
public LiveData<List<Item>> getItems() {
return items;
}
}
如果您观察到此情况,则在修改“房间”中的项目时,它将自动在onStart
(当您再次开始观察)中更新此LiveData。