我正在与团队一起使用MvvmCross创建一个Android应用程序。最近我们开始看到大量重复的警告/错误消息,如下所示:
MvxBind:Warning:207.06 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
[0:] MvxBind:Warning:207.06 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
09-05 17:56:25.076 I/MvxBind (20932): 207.06 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
09-05 17:56:25.086 I/mono-stdout(20932): MvxBind:Warning:207.06 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
[0:]
MvxBind:Warning:207.08 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
[0:] MvxBind:Warning:207.08 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
09-05 17:56:25.096 I/MvxBind (20932): 207.08 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
09-05 17:56:25.096 I/mono-stdout(20932): MvxBind:Warning:207.08 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
[0:]
09-05 17:56:25.116 I/MvxBind (20932): 207.10 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
MvxBind:Warning:207.10 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
[0:] MvxBind:Warning:207.10 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
09-05 17:56:25.126 I/mono-stdout(20932): MvxBind:Warning:207.10 Weak Target is null in MvxTextViewTextTargetBinding - skipping set
[0:]
09-05 17:56:25.126 I/MvxBind (20932): 207.12 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
MvxBind:Warning:207.12 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
[0:] MvxBind:Warning:207.12 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
09-05 17:56:25.136 I/mono-stdout(20932): MvxBind:Warning:207.12 Weak Target is null in MvxWithEventPropertyInfoTargetBinding - skipping set
这些消息在从显示MvxGridView的视图切换后大约3分钟开始。 MvxGridview绑定到一组视图模型,每个视图模型都有自己的绑定。消息将继续,直到应用程序停止。一旦消息开始,UI就变得越来越迟缓,并最终完全锁定。有趣的是,从屏幕切换似乎是触发器。我可以切换屏幕,然后什么也不做,大约3分钟,大量的消息将开始泛滥。如果我将应用程序留在该屏幕上,一切都顺利进行。
最终,我只是想知道如何解决问题,以便应用程序正常运行。可能有助于实现该目标的一些问题包括:
修改
这是Environment.StackTrace
的{{1}}变量。 DebugTrace.cs
和MvxTextViewTextTargetBinding
的堆栈跟踪完全相同。 (为了便于阅读,我删除了处理调用IMvxTrace.Trace的堆栈跟踪的前几行。)
MvxWithEventPropertyInfoTargetBinding
答案 0 :(得分:2)
我必须在显示OnDestory()
的视图中覆盖MvxGridView
方法。
public override void OnDestroy()
{
MyProject.Core.ViewModel.MyViewModel vm = this.DataContext as MyProject.Core.ViewModel.MyViewModel;
base.OnDestroy();
vm.Implode();
}
接下来,我创建了一个如下所示的界面:
public interface IActiveViewModel
{
/// <summary>
/// Used to explicitly dispose of the viewModel
/// </summary>
void Implode();
}
其余代码都在关联的视图模型MyViewModel
中。
开始上课的新界面:
public class MyViewModel : MvxViewModel, IActiveViewModel
并将此函数添加到类中:
public void Implode()
{
if (MyGridTileViewModels != null)
{
foreach (GridTileViewModel vm in MyGridTileViewModels)
{
vm.Dispose();
}
}
this.Dispose();
}
MyGridTileViewModels
是MvxGridView
绑定的属性,它的定义如下:
private ObservableCollection<GridTileViewModel> _myGridTileViewModels = null;
public ObservableCollection<GridTileViewModel> MyGridTileViewModels
{
get { return _myGridTileViewModels; }
protected set
{
// Set data and raise property changed here
}
}
答案 1 :(得分:1)
0.1。是否有可能从MvvmCross获得更详细的堆栈跟踪?
您的应用可能已经提供了自己的DebugTrace
实施 - 因此您可以在实施过程中提供您想要的任何其他跟踪信息。在C#中,使用Environment.StackTrace可以获得堆栈跟踪(但我从未在MonoDroid中使用它 - 但我认为它有效!)
0.2。我是否需要手动处理MvxGridView的每个单元格中的绑定...?
MvxGridView绑定通常存储在拥有的Activity(或Fragment)中。当该活动OnDestroy
时,应该清除这些内容 - 请参阅https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Droid/Views/MvxBindingActivityAdapter.cs#L49
每个单元格中的绑定将存储在单元格中。当这个单元格为Disposed
- https://github.com/slodge/MvvmCross/blob/v3/Cirrious/Cirrious.MvvmCross.Binding.Droid/Views/MvxBaseListItemView.cs#L42时,这些应该被清除 - 这个时间由Xamarin.Android决定,但是因为v4 MonoDroid已经保证它在所有Java.Lang.Object上正确实现了IDisposable派生对象(参见4.0发行说明 - http://docs.xamarin.com/releases/android/mono_for_android_4/mono_for_android_4.0.0)
我的猜测(来自“绑定到视图模型的集合,每个都有它自己的绑定”)是你的网格单元可能绑定到比View / ViewModel更长寿命的对象不知怎的 - 以某种方式,ViewModel及其绑定的生存时间长于其包含的View / Activity的生命周期。
当然,如果你愿意,你可以尽早清除任何绑定 - 虽然我在你的特定情况下没有任何建议 - 目前仍然没有太少的代码。作为第一步,我建议制定出什么能让你的ViewModel保持在内存中,而你的视图似乎已成功消失。详细的堆栈跟踪可能对此有所帮助。