在一个文字游戏应用中,我在活动和片段之间共享一个模型:
该片段观察mDisplayedGame并在自定义视图中显示它(请参见上面截图的右侧)。
我的问题是,当游戏列表在服务器上更新时(并且活动通过Websocket接收到新的游戏列表并将其存储在Room中),我需要向片段发布更新:“嘿,你正在显示的游戏已更新,请重新绘制它!”
是否可以从共享视图模型内部执行此操作?
我知道我也可以在片段中观察mGames并添加一个代码,遍历它们,然后找出服务器上是否更新了显示的游戏。
但我更喜欢在MainViewModel中执行此操作,因为我有一种感觉,即片段应仅观察它正在显示的一个游戏,而仅此而已。
简而言之,每当通过Room在视图模型中更新mGames时,我也需要通知mDisplayedGame观察者!
public class MainViewModel extends AndroidViewModel {
private LiveData<List<Game>> mGames;
private final MutableLiveData<Game> mDisplayedGame = new MutableLiveData<>();
(请原谅截图中的非英文文本)
该活动观察用户当前正在玩的mGames,并更新导航抽屉菜单(请参见上面截图的左侧)。该片段观察mDisplayedGame并在自定义视图中显示它(请参见上面截图的右侧)。
我的问题是,当游戏列表在服务器上更新时(并且活动通过Websocket接收到新的游戏列表并将其存储在Room中),我需要向片段发布更新:“嘿,你正在显示的游戏已更新,请重新绘制它!”
是否可以从共享视图模型内部执行此操作?
我知道我也可以在片段中观察mGames并添加一个代码,遍历它们,然后找出服务器上是否更新了显示的游戏。
但我更喜欢在MainViewModel中执行此操作,因为我有一种感觉,即片段应仅观察它正在显示的一个游戏,而仅此而已。
简而言之,每当通过Room在视图模型中更新mGames时,我也需要通知mDisplayedGame观察者!
MediatorLiveData
(还有一些Transformation
方法可能也可以胜任……其中一些我认为只是包装了MediatorLiveData
)。 - John O'ReillyTransformations.switchMap
应该可以工作。 - EpicPandaForce