MvvmCross泛滥消息:“弱目标在...中为空 - 跳过集”

时间:2013-09-05 22:43:26

标签: android mvvmcross

我正在与团队一起使用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分钟,大量的消息将开始泛滥。如果我将应用程序留在该屏幕上,一切都顺利进行。

最终,我只是想知道如何解决问题,以便应用程序正常运行。可能有助于实现该目标的一些问题包括:

  1. 是否有可能从MvvmCross获得更详细的堆栈跟踪?的 ANSWERED
  2. 我是否需要手动处理MvxGridView的每个单元格中的绑定,如下所示:Clear bindings in MvvmCross? (绑定会自动绑定,因此可能会偏离轨道。)

  3. 修改

    这是Environment.StackTrace的{​​{1}}变量。 DebugTrace.csMvxTextViewTextTargetBinding的堆栈跟踪完全相同。 (为了便于阅读,我删除了处理调用IMvxTrace.Trace的堆栈跟踪的前几行。)

    MvxWithEventPropertyInfoTargetBinding

2 个答案:

答案 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();
}

MyGridTileViewModelsMvxGridView绑定的属性,它的定义如下:

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保持在内存中,而你的视图似乎已成功消失。详细的堆栈跟踪可能对此有所帮助。