线程安全地将数据从服务传递到活动 - Android

Posted

技术标签:

【中文标题】线程安全地将数据从服务传递到活动 - Android【英文标题】:Thread safe passing of data from service to activity - Android 【发布时间】:2012-12-05 14:58:18 【问题描述】:

我正在开发 XMPP 聊天应用程序,并且正在使用 aSmack。我有一个保存 XMPP 连接、注册名册和数据包侦听器等的服务。

目前,我的服务登录然后调用 connection.getRoster() 并在 Singleton 类中存储/更新所有 RosterEntrys(及其状态)。然后在主要活动中,我通过调用 Singleton.getInstance().getRosterEntrys() 获取所有这些 RosterEntrys 并填充 listView。

毫不奇怪,我遇到了各种各样的竞争条件,这不是线程安全的。我正在考虑完全放弃 Singleton 的想法,但我不确定最好的方法。

以线程安全的方式将 Set 从服务传输到 Activity 的最佳方法是什么?我看到提到将 Singleton 与 SynchronizedSet 一起使用。这值得研究吗?还有其他建议吗?

【问题讨论】:

【参考方案1】:

我通过在 Service 和 Activity 上注册一个 BroadcastListener 解决了这个问题。然后我在意图之间来回传递 ArrayList。这已被证明是在活动或服务之间传输信息集合的一种非常干净和有效的方式

【讨论】:

【参考方案2】:

从 Service 到 UI,我会使用 runOnUI 方法。

“最佳”是主观的,出于某种原因有人会说方法 1,而不是其他原因方法 2。

您可以开发一个同步方法。

我正在使用 AsyncTask-s 从网络获取消息到 UI,您可以在运行在 UI 线程上的 onPostExecute 处执行各种操作,例如调用同步方法。

希望对你有帮助!

【讨论】:

我使用过 bot AsyncTask-s 和 runOnUI 方法,它们对于在同一活动的后台执行任务然后反映 UI 的变化非常有用,但我没有尝试使用 between文件。我将探索这个选项,看看是否/如何可能。 “以线程安全的方式将 Set 从服务传输到 Activity 的最佳方式是什么?”指将数据从后台任务传输到 ui。 谢谢matheszabi。如果 runOnUI 方法在同一个文件中或者在您的应用程序中只有一个活动但在多个活动应用程序中这是没有用的最原始示例中,则它非常有用,因为您不知道当前在哪个 UI 视图中前景。我已经使用广播侦听器并在意图之间来回传递 ArrayList 解决了这个问题。这已被证明是在活动或服务之间传输信息集合的一种非常干净和有效的方式

以上是关于线程安全地将数据从服务传递到活动 - Android的主要内容,如果未能解决你的问题,请参考以下文章

如何使用安全参数将数据从导航抽屉传递到活动?

将令牌从服务器传递到客户端并以安全方式存储

如何线程安全地将并行进程中的数据收集到单个对象中?

将数据传递到上一个活动并使用相同的按钮移动到下一个

如何将数据从活动传递到正在运行的服务

如何安全地将所有 IIS 设置从一台服务器导出到另一台服务器?