我正在开发一个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();
我不知道为什么抛出此异常。在我看来,我的演员表似乎不对。你能帮我吗?
答案 0 :(得分:0)
ApplicationContext
不一定与Application
实例是同一对象。我在仿真器中最经常看到这种情况,但它也可能是特定于设备的。
在Java应用程序中,可以强制转换Activity#getApplication()
返回的对象。但是根据post on the Xamarin forum,Xamarin中不存在等效方法。相反,您可以投射Application
属性:
MyApplication app = (MyApplication) Application;
我不确定何时设置该属性,因此这可能不适用于字段初始化程序。
另一种选择是让MyApplication
在OnCreate()
中保存对自身的静态引用,并提供一个静态吸气剂。尽管静态字段通常是有害的,但这是可行的,因为Application
实例实际上是单例,并且其OnCreate
会在创建任何其他组件之前被调用。静态引用不会泄漏应用程序,因为应用程序已经具有与进程相同的生存期。
答案 1 :(得分:0)
好吧,我通过删除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();