提问人:Kikanye 提问时间:8/3/2023 更新时间:8/4/2023 访问量:161
如何在Android .NET MAUI中的应用关闭上进行一些异步清理工作?
How to do some async cleanup work on app closure in Android .NET MAUI?
问:
在我的应用程序中,每当我的应用程序关闭时,我都需要执行一些异步清理。理想情况下,我想要一个可以跨平台工作的解决方案,但现在我想让它专门在 Android 上工作。我知道从 MAUI 应用程序生命周期中,应该在应用程序关闭时调用 OnDestroy,因此它似乎是放置它的正确位置,但它似乎没有执行。奇怪的是,如果我删除异步调用,同步调用似乎可以正常工作。下面是一些代码来说明:
在我的 App.xaml.cs 中
public partial class App: Application
{
//... some other code here
private JoinableTaskContext _joinableTaskContext = new JoinableTaskContext();
protected override Window CreateWindow(IActivationState? activationState){
Window window = base.CreateWindow(activationState);
window.Destroying += Window_Destroying;
return window;
}
private void Window_Destroying(object? sender, EventArgs e){
/* Wrapping the async call in a joinableTaskFactory to avoid using async void in
the method signature*/
_ = _joinableTaskContext.Factory.RunAsync(async () =>
{
await CleanupOnDestroyAsync();
});
// Some synchronous call to stop a ForegroundService that uses intents.
}
private async Task CleanupOnDestroyAsync(){
await myService.Cleanup();
}
}
我也尝试在 MAUI-Android 原生 OnDestroy 中使用此代码,但这也不起作用。
关于我如何处理这个问题的任何想法?
答:
这是实现可靠服务器-应用通信的一种可能设计。
它从我的头顶上掉下来,给人“深思”。
将其视为意见或头脑风暴;不是确定的。
我的主要目标是让你质疑问题中隐含的假设。
服务器
- 在服务器-客户端通信中,服务器不应假定客户端(应用程序)有机会告诉它“我完成了”。服务器和客户端之间的通信可能会中断,从而无法做到这一点。
解决方案:为每个客户端设置一些最大超时时间。如果服务器在这段时间内没有收到客户端的消息,请终止会话并执行任何清理。
超时时间应该有多长取决于保留每个会话的“昂贵程度”,以及处理来自客户端的额外数据包的成本,这些数据包声称它们仍然处于活动状态。可以是几分钟到一天不等。
一个简单的实现是运行一个定期作业,检查所有打开的会话,关闭任何超过超时的会话。
应用程序
依赖应用闭包代码运行是不安全的。尤其是在 Android 上,每个供应商都会调整操作系统。
设计你的应用,使它每当进入后台时,它都会执行任何必要的操作,即使应用再也没有机会运行代码。
例如,Android: Save simple, lightweight UI state using onSaveInstanceState() 包含以下语句:
若要保存持久性数据(如用户首选项或数据库数据),请在活动处于前台时抓住适当的机会。如果没有出现这样的机会,请在 onStop() 方法期间保存持久性数据。
应用应定期与服务器通信,以便不会触发超时。跟踪您上次向服务器发送消息的时间;如有必要,使用计时器发送虚拟消息。每当发送任何消息时重置计时器。 [超时时间越长,这越不重要。这种虚拟消息可以省略;如果会话超过超时,只需重新建立会话即可。如下一点。
如果通信中断,则下次客户端与服务器通信时,服务器可能已经终止了会话。客户端和服务器都需要应对这种情况;建立新会话,用户无需再次输入登录名。“令牌”可能会有所帮助。[登录时,应用程序将发送一个令牌,该令牌仅在此设备有效,有效期为 12 小时。
在您的具体情况下:
除了定期发送消息(当应用处于前台时)之外,请考虑在应用进入后台以及返回前台时发送消息。
服务器可以使用它来调整超时。例如,如果用户处于数据输入的中间,可能会延长超时,希望用户能够返回到应用程序,以完成他们正在执行的操作。[或者,应用程序可能只是将部分输入的数据保存在本地,因此即使服务器丢球,也可以从用户离开的地方继续。
评论