【问题标题】:Xamarin.Android work slowly when device is blocked设备被阻止时 Xamarin.Android 工作缓慢
【发布时间】:2019-12-25 23:24:17
【问题描述】:

一开始我构建了一个桌面应用程序(.NET Framework 中的 WPF)和引擎(.NET Framework 中的类库)。后来我尝试在 Xamarin.Forms/Xamarin.Android 中为 Engine 项目构建前端。当我刚刚添加对 Xamarin 项目的引用并且一切正常时,我感到很惊讶。

当我运行我的 android 应用程序并使用电源按钮阻止设备时出现问题 - 应用程序开始工作慢 2-3 倍。即使是 Task.Delay(1000) 也需要 1500-3000 毫秒才能执行。 我在引擎项目中有内部计时器,这个问题导致引擎内部的实时和时间之间的时间差异。

Engine 项目是多线程项目。它在工作期间创建和销毁许多线程。

我尝试过的:

  • 使用 WakeLock.Partial。
  • 使用 Android.App.Service
  • 禁用电池电量优化
  • 应用的所有权限
  • 在设备设置中将应用程序添加到“白名单”(在后台工作,忽略电池 优化选项)

当设备连接到电源时,应用程序在被阻止的设备上正常工作。

安卓版本:10

是否可以让安卓设备的 CPU 一直保持全功率运行?设备被阻塞时如何保持代码执行速度正常?

【问题讨论】:

  • "...保持 android 设备的 CPU 一直以全功率运行..." :Linux 内核对此负责(并且 Android 不是实时操作系统),即如果设备处于“锁定”模式,那么如果设备包含具有“大”和“小”核心的 SoC,由于电源管理,您的应用程序的基于服务/广播意图的线程将被移动到小核心。但这在很大程度上取决于设备的 API 级别、设备中使用的 SoC 以及 OEM 如何调整 Android 的电源管理功能。
  • 唯一可以“在某种程度上”保证您的应用程序继续运行的事情之一是使用前台服务(即使这在某种程度上取决于 OEM)。您看到诸如 Task.Delay 时间增加的原因是应用程序正在被操作系统暂停。在最新的 API 级别中,拥有全时运行服务变得越来越受限制,因此您的移动应用程序设计不应设计为需要全时服务(除非您是流媒体(即 VoIP)、音乐播放等...)。
  • @prog777,根据你的描述,你的意思是你在设备上调试xamarin.android,它工作正常,但是当设备阻塞时,这个项目工作很慢?
  • @SushiHangover 我用通知构建了前台服务。当我点击通知按钮时,我可以看到系统时间和我的引擎时间。在“锁定”模式下等待 1 分钟后,大约有 15 秒的差异。我认为可能是由于引擎在其他线程上进行计算,所以前台服务没有帮助(我不是android编程专家)。
  • @CherryBu-MSFT 是的,当设备连接到 PC USB 端口时,应用程序也可以正常工作 - 无论设备是否被阻止。当设备被阻止且未连接任何设备时,请不要工作。

标签: android .net xamarin


【解决方案1】:

我找到了解决方案 - 前台服务中的 WakeLock。 仅前台服务是不够的。

通过这种组合,当设备被锁定且未连接任何电源时,引擎以正常速度工作。

【讨论】:

  • 很高兴听到您自己解决了您的问题,请记得将您的回复标记为答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
相关资源
最近更新 更多