Java 从IntentService传递数据
我有以下流程:Java 从IntentService传递数据,java,android,android-intent,android-fragments,intentservice,Java,Android,Android Intent,Android Fragments,Intentservice,我有以下流程: ActivityA/FragmentA通过一个定制的较大对象传递给ActivityB/FragmentB。 对象的属性中有一个列表项 用户在FragmentB中按下一个小部件,然后FragmentB启动ActivityC/FragmentC,同时传递应该在其UI中显示详细信息的自定义对象(可包裹),并且还启动一个服务,以获取填充该特定对象的项的列表。 当服务从后台HTTP调用获取结果时,我需要更新UI中的列表,该列表将显示获取的这些项目。 此列表位于FragmentC中,其中包含
ActivityA/FragmentA通过一个定制的较大对象传递给ActivityB/FragmentB。
对象的属性中有一个
列表项
用户在FragmentB中按下一个小部件,然后FragmentB启动ActivityC/FragmentC,同时传递应该在其UI中显示详细信息的自定义对象(可包裹),并且还启动一个服务
,以获取填充该特定对象的项的列表。
当服务从后台HTTP调用获取结果时,我需要更新UI中的列表,该列表将显示获取的这些项目。
此列表位于FragmentC中,其中包含带有项的自定义对象的副本为空。
服务
有另一个自定义对象副本和刚刚获取的项
,但无法更新片段列表。
为片段创建一个静态变量,并分配this
,然后在片段中公开一个公共方法,服务可以调用该方法来传递项目,但效果很差。
我想知道这是什么样的干净/标准设计
我正在使用LocalBroadcastManager,但列表相当大,我不确定通过intent传递它是否是一个好主意
通常,当我们使用意图
时,它是为了跨越进程边界,因此意图
必须转换为字节数组(通过包
),这对于大数据来说是个问题LocalBroadcastManager
不这样做——它只是按原样传递Intent
对象
LocalBroadcastManager
的缺点是消息是Intent
,并且由于Intent
通常用于IPC,因此它对数据类型有限制。就我个人而言,我推荐greenrobot的EventBus,或者甚至Square的Otto,而不是LocalBroadcastManager
,正是出于这个原因。也就是说,如果您很容易将数据放入意图中,那么大小不应该是一个问题。如我所述,使用事件总线,在其他答案中。@commonware:我使用的是LocalBroadcastManager,但列表相当大,我不确定通过intent传递它是否是一个好主意。我不清楚您所说的跨进程边界是什么意思。每个片段都是一个独立的过程?它们不仅仅是同一进程空间中的类?@Jim:“每个片段都是一个单独的进程?”--不,但通常不会将Intent
对象与片段一起使用。将Intent
对象与startActivity()
、startService()
和sendBroadcast()
等方法一起使用。即使所讨论的活动/服务/接收者恰好在您自己的流程中,也会跨越流程边界。这就是为什么通常大小是意图的问题LocalBroadcastManager
是本地的,不受相同的限制。所以Android中默认的机制是通过最适合IPC调用的基础设施提供的?@Jim:我不知道你认为“默认机制”是什么。@Jim:“使用共享数据模型和单例管理器,可能会导致数据丢失,例如在暂停时”这取决于你如何实施它。“其他方法会发生这种情况吗?”——这也取决于您如何实现它。这与你最初的问题相去甚远。