gpt4 book ai didi

旋转期间的 MvvmCross ViewModel 生命周期

转载 作者:行者123 更新时间:2023-12-04 15:23:41 32 4
gpt4 key购买 nike

我一直在使用 Mvvmcross 开发 Android 应用程序。我正在处理轮换期间 ViewModel 生命周期的问题。似乎通常 ViewModel 在旋转期间被保留。但是,当我在 MvxTabActivity 中显示 ViewModel 时,情况并非如此。当旋转发生时,它总是调用 ViewModel 构造函数。

我使用了与 N+1 教程 https://github.com/slodge/NPlus1DaysOfMvvmCross/tree/master/N-25-Tabbed 中类似的代码结构.

在使用 MvxTabActivity 时,有没有办法修改本教程以在旋转期间将 ViewModels 保留在内存中?

最佳答案

尝试解决 Android 旋转行为的默认 ViewModel 缓存基于 IMvxSingleViewModelCache - 所以它不能处理多个事件和多个 View 模型也就不足为奇了。
关于这个接口(interface)的声明和使用位置,见 https://github.com/slodge/MvvmCross/search?q=IMvxSingleViewModelCache&ref=cmdform
如果这种行为让您感到困扰,那么您应该可以通过以下方式之一解决它:
1. 使用基于片段的标签而不是基于事件的标签
Android 处理 Fragment 生命周期的方式与 Activity 不同。
2. 或继续使用基于事件的选项卡,但实现您自己的IMvxSingleViewModelCache例如,通过“子”命名约定来识别您的 subview 模型应该很简单。
完成此操作后,您可以实现以下内容:

public class MyCustomViewModelCache
: IMvxSingleViewModelCache
{
private const string BundleCacheKey = "__mvxVMCacheKey";

private int _counter;

private IMvxViewModel _currentViewModel;

public void Cache(IMvxViewModel toCache, Bundle bundle)
{
if (toCache != null
&& toCache.GetType().Name.StartsWith("Child"))
{
// don't worry about caching child view models
return;
}

_currentViewModel = toCache;
_counter++;

if (_currentViewModel == null)
{
return;
}

bundle.PutInt(BundleCacheKey, _counter);
}

public IMvxViewModel GetAndClear(Bundle bundle)
{
var storedViewModel = _currentViewModel;
_currentViewModel = null;

if (bundle == null)
return null;

var key = bundle.GetInt(BundleCacheKey);
var toReturn = (key == _counter) ? storedViewModel : null;
return toReturn;
}
}
本类(class)基于 MvxSingleViewModelCache.cs只需添加一点点。
您可以将此类的实例注册为 IMvxSingleViewModelCache InitializeLastChance 期间的单例您的设置。
  Mvx.RegisterSingleton<IMvxSingleViewModelCache>(new MyCustomViewModelCache());

完成此操作后,主页/选项卡事件应该(我认为)继续工作 - 并且它将在旋转后将 View 模型传递给选项卡子项。
( IMvxSingleViewModelCache 的其他可能性是可能的 - 例如,它可以缓存多个 View 模型 - 但请不要让它缓存太多 View 模型太久,否则您可能会遇到“内存不足”的情况)
3.或关闭Android旋转处理
如果添加 android:configChanges="orientation" flag (或者它是 monodroid 等效属性)然后你可以自己处理旋转。

关于旋转期间的 MvvmCross ViewModel 生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503815/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com