跨多个活动/片段同步数据

时间:2016-05-05 07:18:34

标签: android sqlite android-contentprovider

我有三个组件,我必须同步其数据。

  1. 活动 - 此活动从Content Provider获取数据并拥有ViewPager。它将此数据(Fragment.getInstance(data...))传递给第二个组件,即Fragment

  2. 片段 - 此片段包含特定项目的RecyclerViewonClick(),数据通过意图传递给第三个组件{{1 }}

  3. 活动 - 此处修改了收到的数据。

  4. 在所有三个组件中同步此修改的最佳方法是什么?

2 个答案:

答案 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