【问题标题】:Long running operation inside onEvent of FileObserverFileObserver 的 onEvent 中长时间运行的操作
【发布时间】:2016-01-07 21:36:34
【问题描述】:

我有一个包含 FileObserver 实例的活动。我开始观看 onCreate 并停止观看 onDestroy 活动。那么如果 onEvent 正在执行某些操作并且活动被破坏(用户按下后退按钮)会发生什么?我的 onEvent 是否继续完成它正在做的事情?基本上我想知道 onEvent 是应该启动服务还是自己处理它的业务。

【问题讨论】:

    标签: android android-service android-intentservice fileobserver


    【解决方案1】:

    我的 onEvent 是否继续完成它正在做的事情?

    至少简单地说,是的。 FileObserver 与特定组件的生命周期无关,例如 Activity

    但是,一旦您的应用不再处于前台,您的进程可以随时终止,以便为其他应用释放系统 RAM。默认情况下,发生这种情况时,Android 不会关注您的FileObserver 及其onEvent() 处理。

    如果您希望工作能够快速完成(例如,不到一秒钟),您应该能够将其保持在原处。

    但是,如果您正在做的工作量更大,我会考虑让服务来完成这项工作。根据我们的prior discussion,虽然FileObserver 不应该在IntentService 中,但FileObserver 触发的工作可能是。 onEvent() 会打电话给startService() 告诉服务去做这项工作。服务是向操作系统发出的信号,表明您正在代表用户积极工作,因此您的进程更有可能停留更长时间。

    【讨论】:

    • 感谢您的帮助 +1
    【解决方案2】:

    除非应用程序停止,否则 onEvent 中的代码将继续运行。

    FileObserver.onEvent documentation

    这个方法在一个特殊的 FileObserver 线程上调用。它独立于任何线程运行,因此请注意使用适当的同步!考虑使用post(Runnable) 将事件处理工作转移到主线程,以避免并发问题。

    因此,您唯一需要关心的是您在onEvent 中的具体操作。例如,如果您在 onEvent 方法中更新 UI 或与 Activity / Fragment 交互,那么如果 Activity 消失,这可能会导致崩溃。

    考虑到这一点,服务肯定会增加应用程序在您执行工作时不终止的可能性。

    Service documentation

    Android 系统仅在内存不足时才会强制停止服务,并且必须为具有用户焦点的 Activity 恢复系统资源。如果服务绑定到一个有用户焦点的活动,那么它就不太可能被杀死,如果服务被声明为run in the foreground(稍后讨论),那么它几乎永远不会被杀死。否则,如果服务已启动并长时间运行,那么系统将随着时间的推移降低其在后台任务列表中的位置,并且该服务将变得非常容易被杀死——如果您的服务已启动,那么您必须将其设计为优雅地处理系统重新启动。如果系统终止您的服务,它会在资源再次可用时立即重新启动它...

    所以底线是服务更有可能让您的应用程序保持活力。如果您致电 startForeground,则更有可能发生事件,但在这种情况下,您需要愿意向用户显示通知。

    【讨论】:

    • 我读到了,但不确定其中的含义。那么启动一个 IntentService 来完成这里要做的工作有什么好处吗?我认为服务比单纯的线程具有更高的优先级。那么这个 FileObserver 是如何比较的呢?或者我是否必须对我的 IntentService 做一些额外的事情来为它提供比这个 onEvent 方法更大的保护?
    • 是肯定的好处。请参阅我的更新和@CommonsWare 的回答。当服务正在运行时,您的应用程序不太可能被操作系统终止以释放资源给其他应用程序。
    • @NouvelTravay 添加了有关服务/应用程序生命周期的更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 2011-01-10
    • 2011-11-30
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多