gpt4 book ai didi

c# - MvvmCross(Android)似乎保留了 ViewModels 并且从不处理,我错过了什么

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:44 29 4
gpt4 key购买 nike

如果使用 MvvmCross,你有一个非常简单的 View 模型,它通过 MvxMessager 订阅消息,即使它所在的 View 被释放, View 模型仍保留在内存中并仍然接收这些消息。我设法在一个非常简单的应用程序中复制它,方法是将一些接收器放在稍后销毁的 Activity/fragment 上,但是当通过另一个操作发送消息时, View 模型似乎仍然存在?如果多次导航到同一个 View 模型然后关闭,则创建的 View 模型的每个实例都会收到该消息。

我应该指出这些是我为 MvxMessenger 使用的弱引用,我的 View 模型中没有静态引用,我通过 Dispose 明确地处理了我的 Activity。

这看起来也是所有 MvvmCross 示例(TipCalc/Star Wars)的问题。

我可以手动取消订阅,但我希望 MvxMessenger 的弱引用 token 可以避免这种情况。

史蒂文

最佳答案

因为您正在使用的 View 被释放并不一定意味着关联的 ViewModel 被释放。 Xamarin 使用多种方式来实现垃圾回收。您可以在 Xamarin 应用程序中阅读有关垃圾回收的更多信息 here .以 Sgen 为例,当特定堆空间不足时会发生垃圾回收。考虑到这一点,如果您的应用程序不使用大量内存,则可能需要很长时间才能有效处理您的 View 模型。

您可以使用一些最佳实践来防止这种情况发生:

  • 对于 ViewModel,当 ViewModel 在屏幕上不再可见时,处理您的订阅。更常见的是,您不想在屏幕上不可见时更新 UI。我一般在ViewAppearing订阅事件,在ViewDisappearing取消订阅。
  • [可选] 确定特定 ViewModel 的多个实例是否可以同时存在。在实例中,您能否同时存在多个 LoginViewModel 实例?在这种情况下,您可以实现逻辑以确保只有 ViewModel 的单个实例可以订阅给定消息并清除旧订阅。您可以使用以下方法清除消息类型的旧订阅:

    MvxMessengerHub.RequestPurge(typeof(TStoreMessage));

了解 MvxMessengerHub 的最佳方式作品,或一般的 MvvmCross,阅读其源代码。

关于c# - MvvmCross(Android)似乎保留了 ViewModels 并且从不处理,我错过了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54040726/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com