从单例管理器类发布到 UI 线程

Posted

技术标签:

【中文标题】从单例管理器类发布到 UI 线程【英文标题】:Posting on the UI thread from a singleton manager class 【发布时间】:2012-08-01 07:02:57 【问题描述】:

我有一个从活动(UI 线程)调用的单例管理器类,然后它在不同的线程(网络)上运行,最后应该在调用活动中调用回调方法。

我想知道在 UI 线程上调用回调方法的最佳方式是什么。 我熟悉这些选项(请参阅http://android-developers.blogspot.co.il/2009/05/painless-threading.html

所以我在考虑两个选择:

第一个: 调用活动将实现一个带有 getActivity() 方法的接口。该方法将用于调用 Activity.runOnUiThread(Runnable)。

第二个: 初始化管理器单例的 MainApplication 将传递一个属于 UI 线程的 Handler 实例。

什么是更好的选择? 我也很高兴听到任何其他建议

【问题讨论】:

【参考方案1】:

无论您选择什么选项,您都必须记住,活动具有一定的生命周期,并且不像您的单例类可以完成或移至后台。鉴于此,您应该再次考虑单例是否真的是这里的最佳选择:如果它需要与活动交互,也许活动应该管理其生命周期。如果它不依赖于任何特定活动,您可能希望将其设为服务并发送广播以通知进度等。

你到底想做什么?

【讨论】:

经理提供服务,技术上任何人都可以调用它。此外,作为一个单身人士,只要应用程序没有被调用,它就会一直存在。并且活动确实管理它们的生命周期,因为它们在管理器中注册和注销为侦听器。 在这种情况下调用活动接口方法应该是更好的主意。然后 Activity 可以决定具体做什么以及是否需要在 UI 线程上运行。 在我的应用程序中,活动仅在 UI 线程上运行操作。所有需要不同线程的操作都由管理器运行。所以让 Activity 决定这些事情没有任何好处。考虑到这一点,您仍然认为使用 getActivity() 选项更好吗? Activity 仍然应该决定具体做什么,并且你的管理器类不应该知道 UI 线程和其他实现细节。它的职责是做某事并将结果交付给关心它的组件。在您的情况下,这些是活动,但它们也可能是将内容写入磁盘或通过网络发送或其他方式的服务。只要您与定义明确的接口对话,您(即管理器类)就不应该知道或关心接下来会发生什么。

以上是关于从单例管理器类发布到 UI 线程的主要内容,如果未能解决你的问题,请参考以下文章

Unity 单例模式

Python 多处理管理器类对象线程/进程安全

MFC 线程 UI 中的帮助

Windows 的声音管理器类

Coredata 并发问题

从单例模式说起