System.ObjectDisposedException: невозможно получить доступ к удаленному объекту.- Как проверить, работает ли приложение в Xamarin? - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время я создаю приложение с 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?Большое спасибо!

1 Ответ

0 голосов
/ 22 ноября 2018

Благодаря комментариям @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 {
    }
}
...