Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程安全地将数据从服务传递到活动-Android_Java_Android_Singleton_Android Service_Asmack - Fatal编程技术网

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

Java 线程安全地将数据从服务传递到活动-Android,java,android,singleton,android-service,asmack,Java,Android,Singleton,Android Service,Asmack,我正在开发和XMPP聊天应用程序,正在使用aSmack。我有一个保持XMPP连接、注册花名册和数据包侦听器等的服务 目前,我的服务登录后会调用connection.get花名册(),并在一个Singleton类中存储/更新所有花名册(及其状态)。然后在主活动中,我通过调用Singleton.getInstance().getRosterEntrys()返回所有这些RosterEntrys并填充listView 毫不奇怪,我得到了各种各样的比赛条件,这不是非常线程安全。我正在考虑完全抛弃单身的想法

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

目前,我的服务登录后会调用connection.get花名册(),并在一个Singleton类中存储/更新所有花名册(及其状态)。然后在主活动中,我通过调用Singleton.getInstance().getRosterEntrys()返回所有这些RosterEntrys并填充listView

毫不奇怪,我得到了各种各样的比赛条件,这不是非常线程安全。我正在考虑完全抛弃单身的想法,但我不确定这样做的最佳方式


以线程安全的方式将集合从服务传输到活动的最佳方式是什么?我看到有人提到使用带有SynchronizedSet的Singleton。这件事值得研究吗?还有其他建议吗?

从服务到用户界面,我会使用runOnUI方法

“最佳”是主观的,因为有人会说method1,fr其他原因method2

您可以开发一个同步方法

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


我希望有帮助

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

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