System.InvalidCastException при вызове класса, расширяющего приложение - PullRequest
0 голосов
/ 02 июля 2018

Я работаю над приложением для Android c #, где у меня есть класс, расширяющийся от Application с именем MyApplication. Внутри файла MyApplication этот метод называется getDataFromDB(). Я пытаюсь вызвать этот метод из моего Activity, но я получаю это исключение во время выполнения:

System.InvalidCastException:

MyApplication.cs

public class MyApplication : Application
{
    public MyApplication(IntPtr handle, JniHandleOwnership ownerShip) : base(handle, ownerShip)
    {
    }

    public override void OnCreate()
    {
        base.OnCreate();

        getDataFromDB();
    }

    public void getDataFromDB()
    { // code
    }
 }

Activity.cs

MyApplication application = ((MyApplication)this.ApplicationContext); //here's the location of the exception
application.getDataFromDB();

Понятия не имею, почему выброшено это исключение. Мне не кажется, что мой кастинг неправильный. Не могли бы вы помочь мне?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Ну, я решил это, удалив Аргументы конструктора MyApplication так:

 public class MyApplication : Application
{
public MyApplication() : base(handle, ownerShip) //here's the editing location
{
}

public override void OnCreate()
{
    base.OnCreate();

    getDataFromDB();
}

public void getDataFromDB()
{ // code
}
}

Тогда я позвонил Application:

MyApplication application = new MyApplication();
0 голосов
/ 03 июля 2018

ApplicationContext не обязательно совпадает с объектом Application. Я видел это чаще всего в эмуляторах, но это также может зависеть от устройства.

В приложении Java вы можете привести объект, возвращенный Activity#getApplication(). Но согласно сообщению на форуме Xamarin , эквивалентного метода в Xamarin не существует. Вместо этого вы можете разыграть свойство Application:

MyApplication app = (MyApplication) Application;

Я не уверен, когда установлено свойство, поэтому это может не работать в инициализаторе поля.

Другой вариант - MyApplication сохранить статическую ссылку на себя в OnCreate() и предоставить статический получатель. Хотя статические поля обычно являются злыми, это работает, потому что экземпляр Application фактически является одиночным, и его OnCreate будет вызываться до того, как будет создан любой другой компонент. Статическая ссылка не может утечь приложение, потому что у приложения уже есть то же время жизни, что и у процесса.

...