rid*_*sun 6 android caching android-activity mvvmcross
我需要了解如何使用MvxCachingFragmentCompatActivity.我也问过之前这个问题前一个问题,但我得到了一块示例代码,这是有用的,但不是我所需要的.我需要的是了解如何使用它.
首先,我有一个活动,我的所有观点都是碎片.
我的重要假设是,如果我的活动被拆除并需要恢复,使用MvxCachingFragmentCompatActivity将使我能够恢复我的应用程序导航层次结构.有人可以确认这是否正确.
如果这是正确的,我该如何使用它.例如
如果有一些关于此的文档会很棒.
我需要知道这一点,因为我的活动被拆除然后在我使用另一个活动进行相机功能后恢复.当Activity恢复自身时,我的片段的ViewModel为null.我也发现Close(this)在我的视图模型中不起作用.我确信我没有做我需要做的所有事情来完成这项工作,但我需要指导它应该如何使用.
任何帮助将不胜感激,也许是来自MvvmCross团队的人.我真的被困在这里了.我更喜欢描述行为,而不是指向一个样本,但两者都会很棒.
[ 更新 ]所以我构建了V4和V7 MvvmCross库的调试版本并设置了调试.据我所知,只要你将以下属性添加到你的片段类中,就应该设置缓存你的片段.
[MvxFragment(typeof(MainActivityViewModel), Resource.Id.contentFrame, AddToBackStack = true, IsCacheableFragment = true)]
[Register("com.dummynamespace.MyFragment")]
Run Code Online (Sandbox Code Playgroud)
注意小写命名空间很重要,你的类名可以是大小写混合的.
但是,在我的活动被销毁并重新创建之后,我仍然会遇到问题.在我的情况下,我实际上看到我的活动被破坏,并且连续不断地重建.一个例子是我在活动销毁并重新创建后无法关闭视图.这似乎是由于GetFragmentInfoByTag(MvxCachingFragmentCompatActivity类)中的代码返回关闭视图所需的错误信息.关闭功能需要返回的IMvxCachedFragmentInfo中的ContentId,但是将其返回为0.此外,AddToBackStack属性设置为false.下面我列出了片段信息中返回的内容
AddToBackStack = false
CacheFragment = true
CachedFragment = null
ContentId = 0
FragmentType = This is set to the correct fragment type
Tag = This is set to the corresponding view model for the fragment
Run Code Online (Sandbox Code Playgroud)
在销毁并重新创建活动之前,片段信息是正确的.
我正在使用MvvmCross 4.2.3.有没有人经历过这个?
更新02/03/2017 我发现我的活动被破坏和重建不是由于记忆而是由于相机方向.我们发现只有当我们以横向模式保持相机时它才会失败.
关于ContentId设置为0的问题是由于我的应用程序无法解析IMvxJsonConverter实现.未安装MvvmCross Json插件时会发生这种情况.此外,您还必须将以下内容添加到App.cs文件中,以便进行注册
Mvx.RegisterType<IMvxJsonConverter, MvxJsonConverter>();
Run Code Online (Sandbox Code Playgroud)
如果没有这样做,那么Try.Resolve将失败并跳过使用它的代码.有时它会以静默方式完成,有时会输出日志.在我看来,如果你期望你的应用程序能够在被拆除和重建的活动中存活下来,那么这应该是致命的.
还安装了一个MvvmCross Json插件,您必须在视图模型中实现保存和恢复状态模式save-Restore
更新新问题08/03/2017 我正在测试应用中每个视图的恢复.我这样做是通过允许更改方向来破坏我的MvxCachingFragmentCompatActivity,然后重新创建它.
当活动被破坏时,我的片段也被破坏了.此时,我整理了我的视图模型,以确保它可以自由运行并且不会导致内存泄漏.
但是,当遇到OnCreate时,我遇到了一个问题.它似乎做了两件事
问题是调用MvxFragmentExtensions OnCreate(1)调用视图模型缓存并返回一个尚未启动的视图模型,例如调用它的Start(),但这用于设置DataContext.
在调用RestoreViewModelsFromBundle(2)之后,虽然已经通过构造函数 - > Init-> RestoreState-> Start设置,但DataContext未再次设置事件.所以我现在有一个视图模型没有正确设置,所以我的视图不起作用.
当我拿出我的代码来整理视图模型时,我得到了更多,因为(1)设置的缓存视图模型现在具有正确的数据.但我遇到了其他问题,因为它试图创建一个新的视图模型,因为调用了RestoreViewModelsFromBundle(2).作为一个短期修复,无论如何我可以强制将作为恢复过程一部分创建的视图模型设置为ViewModel
来自MvvmCross团队的人可以帮助了解一些有关这里发生的事情的信息以及原因吗?