System.ObjectDisposedException:无法访问已处置的对象。 -如何检查App是否在Xamarin中运行?

时间:2018-11-21 10:57:43

标签: c# android xamarin oxyplot

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

  

未处理的异常:

     

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

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

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中应用程序的状态?非常感谢你!

1 个答案:

答案 0 :(得分:0)

由于@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 {
    }
}