Xamarin.Mobile:标记为过时的基于任务的 API
Posted
技术标签:
【中文标题】Xamarin.Mobile:标记为过时的基于任务的 API【英文标题】:Xamarin.Mobile: task-based API marked as obsolete 【发布时间】:2013-10-10 12:09:02 【问题描述】:最新版本的Xamarin.Mobile 组件淘汰了一些适用于 android 的基于任务的 API。发布说明对此进行了简要评论:
由于 Activity 生命周期的现实,Android 上基于 Task 的 API 很脆弱,因此异步 API 现在被标记为 [已过时],专门用于 Android。
有人能解释一下这里的脆弱性是什么意思吗?
【问题讨论】:
【参考方案1】:本质上,跨应用生命周期边界使用Task
是自找麻烦。当相机Activity
在Android 上启动时,您实际上是在启动一个全新的应用程序。您的应用程序不再在前台运行,因此 Android 完全有权终止您的应用程序并在相机返回时重新启动它。如果发生这种情况,您的 Task
实例已被销毁,因此您拥有的任何 await
s 或 ContinueWith
s 将永远不会执行。这不是Task
/Android 问题,它只是 Xamarin.Mobile 中的设计缺陷。
因此,魔术 API 被弃用,取而代之的是使用 OnActivityResult
的 API,因为它是正确处理这种情况的唯一方法。如果您注意到,新的 API GetMediaFileExtraAsync
仍会返回 Task<MediaFile>
。
(来源:我编写了 Xamarin.Mobile)。
【讨论】:
非常感谢您的解释!我不知道这个问题与跨应用边界有关。 当您说应用程序生命周期边界时,您的意思是“更具破坏性”的操作,例如调用其他活动以获得结果,或任何生命周期事件,包括在方向更改时重新创建?似乎有些混乱:here 和 here 他们说 rotaion 还可以,here 看起来并不那么乐观,我仍在努力寻找关于将 await 与OnCreate/OnRestart 等 我的实验显示屏幕旋转会破坏任何当前await
ed 操作和活动之间的连接,所以我不确定如果 async examples 旨在更改 UI 项目的内容,它们将如何工作与打印到控制台相反,用户在执行操作时旋转屏幕。
在实例级变量中缓存 UI 控件显然也不起作用,因为闭包不能以这种方式工作,例如如果同时旋转屏幕,this example 也不起作用。以上是关于Xamarin.Mobile:标记为过时的基于任务的 API的主要内容,如果未能解决你的问题,请参考以下文章