You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Android应用销毁时ViewModel未销毁问题及解决方案咨询

问题分析与解决方案

这不是Xamarin的问题

出现旧ViewModel实例未被销毁且能接收事件的情况,本质是资源未正确释放导致的内存泄漏,核心原因有两点:

  1. MessagingCenter订阅未取消:ViewModel构造时订阅了事件,但页面销毁后未执行取消操作,MessagingCenter会持续持有ViewModel的引用,GC无法回收该实例。
  2. Firestore SnapshotListener全局持有:Listener被存在GlobalThings静态变量中,应用通过返回键退出后可能未完全销毁,Listener持续发送事件,而旧ViewModel仍在MessagingCenter的订阅列表内,因此能收到通知。

解决方案

1. 实现ViewModel资源释放,取消MessagingCenter订阅

让OrdersViewModel实现IDisposable接口,在Dispose方法中清除订阅:

public class OrdersViewModel : IDisposable
{ 
    public OrdersViewModel()
    {
        MessagingCenter.Subscribe<IRepositoryService, List<FirestoreOrderDetail>>(this, "ORDERS", (s, o) =>
        {
            Task.Run(() => LoadOrders(o));
        });
        Task.Run(() => ExecuteLoadOrdersCommand()); 
    }

    // 保留原有ExecuteLoadOrdersCommand等方法...

    public void Dispose()
    {
        // 取消MessagingCenter订阅
        MessagingCenter.Unsubscribe<IRepositoryService, List<FirestoreOrderDetail>>(this, "ORDERS");
    }
}

在MyOrdersPage的页面生命周期中调用Dispose释放资源:

public partial class MyOrdersPage : ContentPage
{
    OrdersViewModel _orderViewModel;
    public MyOrdersPage()
    {
        InitializeComponent();
        BindingContext = _orderViewModel = new OrdersViewModel();
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        // 页面消失时释放ViewModel资源
        (_orderViewModel as IDisposable)?.Dispose();
    }
}

2. 管理Firestore SnapshotListener生命周期

在MainActivity的OnDestroy方法中移除Listener,避免应用销毁后仍持续发送事件:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    // 保留原有OnCreate、OnBackPressed等方法...

    protected override void OnDestroy()
    {
        base.OnDestroy();
        // 移除Firestore监听并清空全局引用
        GlobalThings.OrderRepoistoryListenerForShopRegistration?.Remove();
        GlobalThings.OrderRepoistoryListenerForShopRegistration = null;
    }
}

3. 额外优化(可选)

如果业务场景不需要后台持续接收订单数据,可以在MyOrdersPage的OnDisappearing中同步移除Listener,进一步减少不必要的资源持有,具体需根据业务需求调整。


内容的提问来源于stack exchange,提问作者anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 13:34:57