首页 > 解决方案 > System.ObjectDisposedException:无法访问已处置的对象。- 如何检查应用程序是否在 Xamarin 中运行?

问题描述

我目前正在使用 Xamarin 和oxyplot创建一个应用程序。我的情节在主应用程序页面上可见,每当我关闭我的应用程序时,它都会崩溃并显示以下消息:

未处理的异常:

System.ObjectDisposedException:无法访问已处置的对象。对象名称:'OxyPlot.Xamarin.Android.PlotView'。

请注意,这是 oxyplot-xamarin 包中的一个已知错误。现在,我正在尝试解决这个问题,但到目前为止没有成功。我的代码的关键部分如下所示:

private void OnTimerElapsed(object state)
{
    lock (Model.SyncRoot)
    {
        Update();
    }
    try {
        Device.BeginInvokeOnMainThread(() => Model.InvalidatePlot(true)); // this line crashes the app
    } catch {
    }
}

我想在这个定期调用的函数中询问应用程序是否还活着或者它是否已经关闭。因此,解决方案必须看起来像这样:

private void OnTimerElapsed(object state)
{
    lock (Model.SyncRoot)
    {
        Update();
    }
    try {
        if (AppIsNotClosed)
        {
             Device.BeginInvokeOnMainThread(() => Model.InvalidatePlot(true)); // this line crashes the app
        }
    } catch {
    }
}

任何想法如何检查 Xamarin 中应用程序的状态?非常感谢!

标签: c#androidxamarinoxyplot

解决方案


感谢@SushiHangover 的评论,我现在想出了下面给出的解决方案。我的 App.xaml.cs 现在如下所示:

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

[assembly: XamlCompilation(XamlCompilationOptions.Compile)]
namespace MyNamespace
{
    public partial class App : Application
    {
        private static bool AppIsActive = false;

        public App()
        {
            // InitializeComponent();
        }

        protected override void OnStart()
        {
            // Handle when your app starts
            AppIsActive = true;
        }

        protected override void OnSleep()
        {
            // Handle when your app sleeps
            AppIsActive = false;
        }

        protected override void OnResume()
        {
            // Handle when your app resumes
            AppIsActive = true;
        }

        public static bool IsAppActive()
        {
            return AppIsActive;
        }
    }
}

然后,有问题的方法可以重写如下:

private void OnTimerElapsed(object state)
{
    lock (Model.SyncRoot)
    {
        Update();
    }
    try {
        if (App.IsAppActive()) {
            Device.BeginInvokeOnMainThread(() => Model.InvalidatePlot(true));
        } else {
            timer.Dispose();
        }
    } catch {
    }
}

推荐阅读