在多个 activities/fragments 之间同步数据
Synchronise data across multiple activities/fragments
我必须同步三个组件的数据。
Activity - 这个 activity 从 Content Provider
获取数据并且有一个 ViewPager
。它将此数据 (Fragment.getInstance(data...)
) 传递给第二个组件,即 Fragment
Fragment - 这个片段有一个特定项目的 RecyclerView
和 onClick()
,数据通过 intent 传递给第三个Activity
.
的组件
Activity - 这里接收到的数据被修改。
在所有三个组件之间同步此修改的最佳方式是什么?
不要在不同的活动和片段之间持有对相同 POJO(普通旧 java 对象)的引用。请改用共享首选项或 SQL 数据库。
活动和片段应该是stateless。所以我要告诉你如何在活动和片段之间传输数据,而不是如何同步数据。
让我们逐一分析:
'1 到 2': 您可能已经拥有 activity 中的所有片段。所以只需调用 fragment.sendData(...)
即可将数据发送到片段。 警告: 如果您使用的是 FragmentStateAdapter
,则必须这样做 (reference):
if (adapter.getCount() > 0) {
fragment = (MyFragment) adapter.instantiateItem(
null, viewPager.getCurrentItem());
// A NullPointerException is thrown if the item isn't initialized as yet
// So be careful.
}
'2 to 1': 创建片段回调接口(比如FragmentCallback
),activity1 必须实现,即覆盖 Fragment.onAttach(Activity activty)
,检查是否 activity instanceof FragmentCallback
,如果不是则抛出异常。 (这是android工作室在你创建新片段时自动生成的)
'1 到 3': 通过将 Intent
与数据一起传递来启动 activity。
'2 到 3': 通过将 Intent
与数据一起传递来启动 activity。如果您需要来自 activity1 的一些数据,请不要使用此方法。使用“2 到 1”,然后是“1 到 3”。
'3对1':正确的做法是重新开始activity1 与 Intent
数据或将其发送到原始 activity1 使用 startActivtyForResult
并在 [= 中处理结果94=]1。如果需要,您可以使用 android:launchMode="singleTop"
(ref)。如果你必须发送原件activity(startActivtyForResult
无法满足的方式),它是绝对是代码味道。使用共享首选项或其他东西并在 Activity1.onResume
and/or Activity1.onCreate
.
中检查它
'3 to 2':使用'3 to 1',然后是'1 to 2'。
我采用了简化通信的事件总线库。在 EventBus
查看
我必须同步三个组件的数据。
Activity - 这个 activity 从
Content Provider
获取数据并且有一个ViewPager
。它将此数据 (Fragment.getInstance(data...)
) 传递给第二个组件,即Fragment
Fragment - 这个片段有一个特定项目的
RecyclerView
和onClick()
,数据通过 intent 传递给第三个Activity
. 的组件
Activity - 这里接收到的数据被修改。
在所有三个组件之间同步此修改的最佳方式是什么?
不要在不同的活动和片段之间持有对相同 POJO(普通旧 java 对象)的引用。请改用共享首选项或 SQL 数据库。
活动和片段应该是stateless。所以我要告诉你如何在活动和片段之间传输数据,而不是如何同步数据。
让我们逐一分析:
'1 到 2': 您可能已经拥有 activity 中的所有片段。所以只需调用
fragment.sendData(...)
即可将数据发送到片段。 警告: 如果您使用的是FragmentStateAdapter
,则必须这样做 (reference):if (adapter.getCount() > 0) { fragment = (MyFragment) adapter.instantiateItem( null, viewPager.getCurrentItem()); // A NullPointerException is thrown if the item isn't initialized as yet // So be careful. }
'2 to 1': 创建片段回调接口(比如
FragmentCallback
),activity1 必须实现,即覆盖Fragment.onAttach(Activity activty)
,检查是否activity instanceof FragmentCallback
,如果不是则抛出异常。 (这是android工作室在你创建新片段时自动生成的)'1 到 3': 通过将
Intent
与数据一起传递来启动 activity。'2 到 3': 通过将
Intent
与数据一起传递来启动 activity。如果您需要来自 activity1 的一些数据,请不要使用此方法。使用“2 到 1”,然后是“1 到 3”。'3对1':正确的做法是重新开始activity1 与
Intent
数据或将其发送到原始 activity1 使用startActivtyForResult
并在 [= 中处理结果94=]1。如果需要,您可以使用android:launchMode="singleTop"
(ref)。如果你必须发送原件activity(startActivtyForResult
无法满足的方式),它是绝对是代码味道。使用共享首选项或其他东西并在Activity1.onResume
and/orActivity1.onCreate
. 中检查它
'3 to 2':使用'3 to 1',然后是'1 to 2'。
我采用了简化通信的事件总线库。在 EventBus
查看