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

.NET 7 MAUI安卓默认启动器重启崩溃:ShapeableImageView已释放异常

问题原因与解决方案

原因分析

当应用被设为安卓默认启动器后,系统会在应用关闭后自动触发重启逻辑。此时MAUI的页面控件生命周期出现异常:之前的ShapeableImageView实例已被系统标记为释放状态,但重启后的代码仍尝试访问该已释放对象,从而抛出ObjectDisposedException。这种系统强制重启的场景下,生命周期流程和普通启动/关闭存在差异,MAUI默认的控件初始化逻辑未适配该场景。

解决方案

1. 调整控件初始化时机

把ShapeableImageView的初始化逻辑从页面构造函数移至OnAppearing方法,每次页面显示时确保控件是全新实例,避免复用已释放对象:

protected override void OnAppearing()
{
    base.OnAppearing();
    // 重新初始化ShapeableImageView
    MyShapeableImageView = new ShapeableImageView(Context);
    // 绑定属性、设置样式等后续操作
}

2. 清理控件引用

为ShapeableImageView注册Disposed事件,在对象被释放时清空对应引用,防止后续代码误访问:

MyShapeableImageView.Disposed += (sender, e) =>
{
    MyShapeableImageView = null;
};

3. 适配安卓端生命周期

在安卓项目的MainActivity.cs中重写OnCreate方法,确保系统重启应用时重新初始化MAUI上下文,避免复用残留的已释放资源:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    // 若为系统触发的重启,强制初始化新的MAUI实例
    if (savedInstanceState != null)
    {
        MauiProgram.CreateMauiApp().Build().Run(this);
    }
}

4. 移除静态控件引用

检查代码中是否存在静态变量持有ShapeableImageView的引用,这类静态引用会在对象释放后仍存在,导致重启时访问已释放对象,需直接移除此类静态引用,改用页面级局部引用。

5. 使用弱引用持有控件(可选)

若业务逻辑必须持有控件引用,改用WeakReference存储,访问前先检查对象是否存活:

private WeakReference<ShapeableImageView> _imageViewRef;

// 初始化时
_imageViewRef = new WeakReference<ShapeableImageView>(MyShapeableImageView);

// 访问时
if (_imageViewRef.TryGetTarget(out var imageView))
{
    // 执行目标操作
}
else
{
    // 对象已释放,执行重新初始化逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:58:16