我有三个组件,我必须同步其数据。
活动 - 此活动从Content Provider
获取数据并拥有ViewPager
。它将此数据(Fragment.getInstance(data...)
)传递给第二个组件,即Fragment
片段 - 此片段包含特定项目的RecyclerView
和onClick()
,数据通过意图传递给第三个组件{{1 }}
活动 - 此处修改了收到的数据。
在所有三个组件中同步此修改的最佳方法是什么?
答案 0 :(得分:1)
不要在不同的活动和片段之间保持对相同POJO(普通旧Java对象)的引用。改为使用共享首选项或SQL数据库。
活动和片段应该是stateless。因此,我将告诉您如何在活动和片段之间传输数据,而不是如何同步数据。
让我们逐个讨论:
'1到2':您可能已经拥有活动中的所有片段。因此,只需调用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':创建 activity1 必须实现的片段回调接口(例如FragmentCallback
),即覆盖{{1} },检查是否Fragment.onAttach(Activity activty)
并抛出异常(如果不是)。 (这是由android studio在您创建新片段时自动生成的)
'1到3':通过传递activity instanceof FragmentCallback
数据来启动活动。
'2 to 3':通过传递Intent
数据来启动活动。如果您需要来自 activity1 的一些数据,请不要使用此方法。使用“2比1”后跟“1比3”。
'3对1':正确的方法是使用Intent
数据启动新的 activity1 或将其发送到原始 activity1 使用Intent
并处理 activity1 中的结果。如果需要,您可以使用startActivtyForResult
(ref)。如果您必须将原始活动(以android:launchMode="singleTop"
无法满足的方式)发送给它,那肯定是代码味道。使用共享偏好设置或其他内容,并在startActivtyForResult
和/或Activity1.onResume
中进行检查。
'3 to 2':使用'3对1',然后是'1到2'。
答案 1 :(得分:0)
我采用了简化通信的事件总线库。请查看EventBus