【问题标题】:OnPropertyChanged throws exception on android in xamarin.forms appOnPropertyChanged 在 xamarin.forms 应用程序中的 android 上引发异常
【发布时间】:2014-09-07 05:54:09
【问题描述】:

我正在使用 Xamarin.Forms 制作一个 Android 应用程序。我的 iOS 应用程序已经完成并发布。 我的 android 版本不会停止抛出多个异常。

第一个例外是NullReferenceException。这会破坏以下代码:

handler(this, new PropertyChangedEventArgs(propertyName));

这是在我用于模型的自定义 NotifyBase 类中的 OnPropertyChanged 方法中。 (如果我从方法中删除除此行之外的所有内容,也会失败。)

调试输出只是告诉我这个:

System.NullReferenceException: Object reference not set to an instance of an object
An unhandled exception occured.
Exception:

后面是TargetInvocationException,给出了这个堆栈跟踪:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
07-16 17:37:47.916 I/MonoDroid(27212): UNHANDLED EXCEPTION:        System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object
07-16 17:37:47.916 I/MonoDroid(27212):07-16 17:37:47.916 I/MonoDroid(27212):   at Xamarin.Forms.Forms+AndroidPlatformServices.BeginInvokeOnMainThread (System.Action action) [0x00000] in <filename unknown>:0 
07-16 17:37:47.916 I/MonoDroid(27212):   at Xamarin.Forms.Device.BeginInvokeOnMainThread (System.Action action) [0x00000] in <filename unknown>:0 
07-16 17:37:47.916 I/MonoDroid(27212):   at Xamarin.Forms.BindingExpression+BindingExpressionPart.PropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs args) [0x00000] in <filename unknown>:0 
07-16 17:37:47.916 I/MonoDroid(27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.ComponentModel.PropertyChangedEventArgs)
07-16 17:37:47.916 I/MonoDroid(27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.ComponentModel.PropertyChangedEventArgs)
07-16 17:37:47.916 I/MonoDroid(27212):   at TransMission.Mobile.Helper.NotifyBase.OnPropertyChanged (System.String propertyName) [0x00087] in c:\Users\Frederik.TECNO\Documents\Visual Studio 2012\Projects\TransMission\TransMission.Mobile\TransMission.Mobile\Helper\NotifyBase.cs:68 
07-16 17:37:47.916 I/MonoDroid(27212):   at TransMission.Mobile.Helper.NotifyBase.SetField[DateTime] (System.DateTime& field, DateTime value, System.String propertyName) [0x000a2] in c:\Users\Frederik.TECNO\Documents\Visual Studio 2012\Projects\TransMission\TransMission.Mobile\TransMission.Mobile\Helper\NotifyBase.cs:102 
07-16 17:37:47.916 I/MonoDroid(27212):   at TransMission.Mobile.Core.TransMissionCore.set_Date (DateTime value) [0x00001] in c:\Users\Frederik.TECNO\Documents\Visual Studio 2012\Projects\TransMission\TransMission.Mobile\TransMission.Mobile\Core\TransMissionCore.cs:275 
07-16 17:37:47.916 I/MonoDroid(27212):   at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (System.Reflection.MonoMethod,object,object[],System.Exception&)
07-16 17:37:47.916 I/MonoDroid(27212):   at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0 
07-16 17:37:47.916 I/MonoDroid(27212):   --- End of inner exception stack trace ---
07-16 17:37:47.916 I/MonoDroid(27212): at System.Reflection.MonoMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) <IL 0x00062, 0x0033c>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindingExpression.ApplyCore (object,Xamarin.Forms.BindableObject,Xamarin.Forms.BindableProperty,bool) <IL07-16 17:37:47.916 I/MonoDroid(27212): at System.Reflection.MethodBase.Invoke (object,object[]) <IL 0x00006, 0x0008f>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindingExpression.ApplyCore (object,Xamarin.Forms.BindableObject,Xamarin.Forms.BindableProperty,bool) <IL 0x00295, 0x0162f>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindingExpression.Apply (bool) <IL 0x00041, 0x0018b>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Binding.Apply (bool) <IL 0x00027, 0x00113>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindableObject/<>c__DisplayClass1.<SetValueCore>b__0 () <IL 0x00100, 0x00493>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindableObject.SetValueCore (Xamarin.Forms.BindableProperty,object,bool,bool,bool) <IL 0x001b4, 0x009d3>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindingExpression.ApplyCore (object,Xamarin.Forms.BindableObject,Xamarin.Forms.BindableProperty,bool) <IL 0x001f1, 0x011db>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindingExpression.Apply (object,Xamarin.Forms.BindableObject,Xamarin.Forms.BindableProperty) <IL 0x0007e, 0x003bf>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Binding.Apply (object,Xamarin.Forms.BindableObject,Xamarin.Forms.BindableProperty) <IL 0x0004d, 0x00237>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindableObject.ApplyBindings (object) <IL 0x0003a, 0x002af>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject,object) <IL 0x00056, 0x0029b>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Element.OnBindingContextChanged () <IL 0x0001c, 0x00157>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.View.OnBindingContextChanged () <IL 0x0003b, 0x002a3>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.BindableObject.SetInheritedBindingContext (Xamarin.Forms.BindableObject,object) <IL 0x0005c, 0x002bf>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Element.set_Parent (Xamarin.Forms.Element) <IL 0x00020, 0x00107>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Element.OnChildAdded (Xamarin.Forms.Element) <IL 0x00002, 0x00053>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Page.OnInternalAdded (Xamarin.Forms.VisualElement) <IL 0x00015, 0x000bf>
07-16 17:37:47.916 I/MonoDroid(27212): at Xamarin.Forms.Page.InternalChildrenOnCollectionChanged (object,System.Collections.Specialized.NotifyCollectionC

未处理的异常:

接着是 TargetInvocationException,给出此堆栈跟踪:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
07-16 17:41:19.182 E/mono    (27212): 
07-16 17:41:19.182 E/mono    (27212): Unhandled Exception:
07-16 17:41:19.182 E/mono    (27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.Compon07-16 17:41:19.182 E/mono    (27212): System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object
07-16 17:41:19.182 E/mono    (27212):   at Xamarin.Forms.Forms+AndroidPlatformServices.BeginInvokeOnMainThread (System.Action action) [0x00000] in <filename unknown>:0 
07-16 17:41:19.182 E/mono    (27212):   at Xamarin.Forms.Device.BeginInvokeOnMainThread (System.Action action) [0x00000] in <filename unknown>:0 
07-16 17:41:19.182 E/mono    (27212):   at Xamarin.Forms.BindingExpression+BindingExpressionPart.PropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs args) [0x00000] in <filename unknown>:0 
07-16 17:41:19.182 E/mono    (27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.ComponentModel.PropertyChangedEventArgs)
07-16 17:41:19.182 E/mono    (27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.ComponentModel.PropertyChangedEventArgs)
07-16 17:41:19.182 E/mono    (27212):   at TransMission.Mobile.Helper.NotifyBase.OnPropertyChanged (System.String propertyName
07-16 17:41:19.182 E/mono-rt (27212): [ERROR] FATAL UNHANDLED EXCEPTION: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object
07-16 17:41:19.182 E/mono-rt (27212):   at Xamarin.Forms.Forms+AndroidPlatformServices.BeginInvokeOnMainThread (System.Action action) [0x00000] in <filename unknown>:0 
07-16 17:41:19.182 E/mono-rt (27212):   at Xamarin.Forms.Device.BeginInvokeOnMainThread (System.Action action) [0x00000] in <filename unknown>:0 
07-16 17:41:19.182 E/mono-rt (27212):   at Xamarin.Forms.BindingExpression+BindingExpressionPart.PropertyChanged (System.Object sender, System.ComponentModel.PropertyChangedEventArgs args) [0x00000] in <filename unknown>:0 
07-16 17:41:19.182 E/mono-rt (27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.ComponentModel.PropertyChangedEventArgs)
07-16 17:41:19.182 E/mono-rt (27212):   at (wrapper delegate-invoke) <Module>:invoke_void__this___object_PropertyChangedEventArgs (object,System.ComponentModel.PropertyChangedEventArgs)
07-16 17:41:19.182 E/mono-rt (27212):   at TransMission.Mobile.Helper.NotifyBase.OnPropertyChanged (System.String
Das Programm "Mono" wurde mit Code 0 (0x0) beendet.

正如我的调试输出所述,这似乎发生在 DateTime 属性上,该属性设置为 DatePicker 的最小值:

07-16 17:32:45.761 I/mono-stdout(27212): DEBUG     - Changing value from '01.01.0001 00:00:00' to '01.01.1900 00:00:00'.
07-16 17:32:45.771 I/mono-stdout(27212): DEBUG     - Raising PropertyChanged for: 'TransMissionCore.Date'.

我的代码在 iOS 上完美运行。但在 Android 上,这是一个表演障碍。 我使用最新版本的 Xamarin.Forms (1.2.1.6229) 和 1.1.1.6206 尝试了我的应用程序,但这没什么区别。

有什么解决方法吗?还是我犯了一个错误? 请指教。

【问题讨论】:

  • 如果处理程序为空,您确定 Android 代码正在订阅事件吗?
  • 你检查过你的数据模型属性和你的转换器(如果有的话)吗?我敢打赌 NullReferenceException 在你的代码中。
  • 处理程序不为空。并且 Property 也不为空。 DateTime 所以不能为空。不涉及转换器。正如 Xamarin 团队在他们的论坛中回答的那样,这是一个已知的错误。

标签: c# android xamarin inotifypropertychanged xamarin.forms


【解决方案1】:

这已在最新版本的 xamarin 表单中得到修复。 在最新版本中,我没有对异常的堆栈跟踪给予足够的关注。 我认为堆栈跟踪是相等的,但它们在某些部分不同 这似乎有另一个来源,来自我的应用程序的另一部分。

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多