您如何设置MvxSuspensionManager

问题描述

我正在创建的UWP应用程序需要拦截Suspending事件,并通过OnSuspending事件处理程序将其写入日志文件。

我了解MVVMCross使用其自己的SuspensionManager,即MvxSuspensionManager。我已经在www.mvvmcross.com中搜索了MvxSuspensionManager文档,但找不到任何文档。我已经进行了一般搜索,发现了一些信息,但它与版本5有关,并且没有涉及任何细节。我确实发现有一个报告的错误,我也曾经遇到过(https://github.com/MvvmCross/MvvmCross/issues/3772),该错误已得到修复,但尚未掌握。

  1. 我想知道如何实现MvxSuspensionManager以满足要求。
  2. 是否有任何示例代码或文档说明如何设置?
  3. 何时发布包含错误修复程序(https://github.com/MvvmCross/MvvmCross/pull/3821)的新MVVMCross版本?

非常感谢您的协助。

解决方法

在您的MvxWindowsSetup上,您可以覆盖CreateSuspensionManager并创建自己的。您只需要从类中的MvxSuspensionManager继承(或实现IMvxSuspensionManager),并覆盖SaveAsync之类的所需方法即可。因此,您可以通过覆盖SaveAsync并与PR中相同的方法来解决此问题(此外,您也可以在其中添加自定义行为)(如果需要的话):

public class MyCustomMvxSuspensionManager : MvxSuspensionManager
{
    try
    {
        // Save the navigation state for all registered frames
        foreach (var weakFrameReference in _registeredFrames)
        {
            IMvxWindowsFrame frame;
            if (weakFrameReference.TryGetTarget(out frame))
            {
                SaveFrameNavigationState(frame);
            }
        }

        // Serialize the session state synchronously to avoid asynchronous access to shared
        // state
        using (var memoryStream = new MemoryStream())
        {
            var serializer = new DataContractSerializer(typeof(Dictionary<string,object>),KnownTypes);
            serializer.WriteObject(memoryStream,SessionState);

            // Get an output stream for the SessionState file and write the state asynchronously
            var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(SessionStateFilename,CreationCollisionOption.ReplaceExisting);
            using (var fileStream = await file.OpenStreamForWriteAsync().ConfigureAwait(false))
            {
                memoryStream.Seek(0,SeekOrigin.Begin);
                await memoryStream.CopyToAsync(fileStream).ConfigureAwait(false);
                await fileStream.FlushAsync().ConfigureAwait(false);
            }
        }
    }
    catch (Exception e)
    {
        throw new MvxSuspensionManagerException(e);
    }
}

--------

public class MySetup : MvxWindowsSetup
{
    ...

    protected override IMvxSuspensionManager CreateSuspensionManager()
    {
         return new MyCustomMvxSuspensionManager();
    }
    ...
}

还可以看到here,默认情况下,它会使用应用程序的根框架将MvxSuspensionManager初始化,您也可以更改此设置并覆盖设置InitializeSuspensionManager,或者您想要注册另一个框架来管理其会话,则只要在应用中的任何位置都可以解析IMvxSuspensionManager,然后使用自定义会话状态密钥:Mvx.IoCProvider.Resolve<IMvxSuspensionManager>().RegisterFrame(_myFrame,_suspensionManagerMySessionStateKey)调用注册。

最后,我强烈建议您阅读MvxSuspensionManager implementation,以便您了解幕后发生的事情。

HIH

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...