android - MvvmCross消息泛滥: "Weak Target is null in ... - skipping set"

标签 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 的 View 切换后大约 3 分钟开始出现。 MvxGridview 绑定(bind)到 View 模型的集合,每个 View 模型都有自己的绑定(bind)。这些消息将持续显示,直到应用程序停止。一旦消息开始,用户界面就会变得越来越迟缓,并最终完全锁定。有趣的是,离开该屏幕似乎是触发因素。我可以切换屏幕,然后什么也不做,大约 3 分钟,然后大量的消息就会开始涌入。如果我将应用程序留在该屏幕上,一切都会顺利运行。

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

  1. 是否可以从 MvvmCross 获取更详细的堆栈跟踪? 已回答
  2. 我是否需要像这样手动处理 MvxGridView 每个单元格中的绑定(bind):Clear bindings in MvvmCross ? (绑定(bind)会自动绑定(bind),因此这可能会偏离轨道。)
<小时/>

编辑

这是来自 DebugTrace.csEnvironment.StackTrace 变量。 MvxTextViewTextTargetBindingMvxWithEventPropertyInfoTargetBinding 的堆栈跟踪完全相同。 (为了便于阅读,我删除了处理调用 IMvxTrace.Trace 的堆栈跟踪的前几行。)

   at Cirrious.MvvmCross.Binding.Bindings.Target.MvxPropertyInfoTargetBinding.SetValue(System.Object value)
   at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.UpdateTargetFromSource(Boolean isAvailable, System.Object value)
   at Cirrious.MvvmCross.Binding.Bindings.MvxFullBinding.<CreateSourceBinding>b__0(System.Object sender, Cirrious.MvvmCross.Binding.Bindings.Source.MvxSourcePropertyBindingEventArgs args)
   at Cirrious.MvvmCross.Binding.Bindings.SourceSteps.MvxSourceStep.SendSourcePropertyChanged(Boolean isAvailable, System.Object value)
   at Cirrious.MvvmCross.Binding.Bindings.SourceSteps.MvxPathSourceStep.SourceBindingOnChanged(System.Object sender, Cirrious.MvvmCross.Binding.Bindings.Source.MvxSourcePropertyBindingEventArgs args)
   at Cirrious.MvvmCross.Binding.Bindings.Source.MvxSourceBinding.FireChanged(Cirrious.MvvmCross.Binding.Bindings.Source.MvxSourcePropertyBindingEventArgs args)
   at Cirrious.MvvmCross.Binding.Bindings.Source.Leaf.MvxLeafPropertyInfoSourceBinding.OnBoundPropertyChanged()
   at Cirrious.MvvmCross.Binding.Bindings.Source.MvxPropertyInfoSourceBinding.SourcePropertyChanged(System.Object sender, System.ComponentModel.PropertyChangedEventArgs e)
   at System.Reflection.MonoMethod.InternalInvoke(System.Reflection.MonoMethod , System.Object , System.Object[] , System.Exception ByRef )
   at System.Reflection.MonoMethod.Invoke(System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(System.Object obj, System.Object[] parameters)
   at Cirrious.CrossCore.WeakSubscription.MvxWeakEventSubscription`2[[System.ComponentModel.INotifyPropertyChanged, System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.ComponentModel.PropertyChangedEventArgs, System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].OnSourceEvent(System.Object sender, System.ComponentModel.PropertyChangedEventArgs e)
   at Cirrious.MvvmCross.ViewModels.MvxNotifyPropertyChanged+<>c__DisplayClass1.<RaisePropertyChanged>b__0()
   at Cirrious.CrossCore.Core.MvxMainThreadDispatcher.ExceptionMaskedAction(System.Action action)
   at Cirrious.MvvmCross.Droid.Views.MvxAndroidMainThreadDispatcher+<>c__DisplayClass1.<RequestMainThreadAction>b__0(System.Object ignored)
   at Android.App.SyncContext+<Post>c__AnonStorey2E.<>m__1F() in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.0-branch/b76e8ec4/source/monodroid/src/Mono.Android/src/Android.App/SyncContext.cs:line 23
   at Java.Lang.Thread+RunnableImplementor.Run() in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.0-branch/b76e8ec4/source/monodroid/src/Mono.Android/src/Java.Lang/Thread.cs:line 32
   at Java.Lang.IRunnableInvoker.n_Run(IntPtr jnienv, IntPtr native__this) in /Users/builder/data/lanes/monodroid-mlion-monodroid-4.8.0-branch/b76e8ec4/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Java.Lang.IRunnable.cs:line 71
   at System.Object.ea853478-e8d0-4bbe-8306-98c58e64097e(IntPtr , IntPtr )

最佳答案

我必须重写显示 MvxGridView 的 View 中的 OnDestory() 方法。

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

其余代码位于关联的 View 模型MyViewModel中。

添加新的类接口(interface):

public class MyViewModel : MvxViewModel, IActiveViewModel

并将此函数添加到类中:

public void Implode()
{
    if (MyGridTileViewModels != null)
    {
        foreach (GridTileViewModel vm in MyGridTileViewModels)
        {
            vm.Dispose();
        }
    }
    this.Dispose();
}

MyGridTileViewModelsMvxGridView 绑定(bind)到的属性,其定义如下:

private ObservableCollection<GridTileViewModel> _myGridTileViewModels = null;

public ObservableCollection<GridTileViewModel> MyGridTileViewModels 
{
    get { return _myGridTileViewModels; }
    protected set
    {
        // Set data and raise property changed here
    }
}

关于android - MvvmCross消息泛滥: "Weak Target is null in ... - skipping set",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18647115/

相关文章:

java - 通过动画过渡动态更改背景颜色

ios - 如何在 Xamarin iOS 中使用 MvvmCross 将 UITableView 绑定(bind)到 List<string>

c# - MvvmCross Android EditText 绑定(bind)不更新屏幕

java - 接收音频文件的插件

android - 尝试更新到 Kotlin 1.4.0 时出现奇怪的错误。如何使其与 Gradle 和 IntelliJ IDEA 2020.2.1 一起使用?

c# - MvxTabBarViewController 作为第一个 ViewController 没有出现

c# - 在 MvvmCross 3.0.14 中是否有不同的方法来绑定(bind) iOS ICommand?

android - 绑定(bind) TimePicker 和 DatePicker - MVVMCross (Mono For Android)

java - 多边形触摸检测 Google Map API V2

android - 使用淡入淡出方法不会使图像出现