【问题标题】:When call initLoader in Fragment?何时在 Fragment 中调用 initLoader?
【发布时间】:2013-09-10 19:36:06
【问题描述】:

我有一个非常简单的带有 ListView、CursorLoader 和 CursorAdapter 的 Fragment。一切都在单个活动中(只是切换片段)。我的问题是 onLoadFinished() 在某些情况下会根据我调用 initLoader() 的位置被调用两次。这些情况是:

  • 配置更改(旋转屏幕等)
  • 使用 FragmentTransaction 将当前片段替换为另一个片段,然后返回(弹出回栈)。在这种情况下,一个列表项的详细信息片段。

当 initLoader() 放入 onCreateView() 时,onActivityCreated() (文档中推荐) onLoadFinished() 在配置更改后被调用两次。 Rudik Krasniynos 解释了原因。但是 onLoadFinished() 在从 backstack 弹出较新的片段时只调用一次。

当 initLoader() 放在 onResume()/onStart() 方法中时,上面的情况是相反的。两次调用 onLoadFinished() 用于弹出回栈,一次调用用于更改配置。

所以问题是在哪里或如何在不调用 onLoadFinished() 两次的情况下初始化 Loader,或者检查什么以不两次初始化 Loader。谢谢!

替换片段代码:

FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.root_view, fragment, tag);
ft.addToBackStack(null);
ft.commit();

CursorAdapter 的代码:

//onCreateView
MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0);
mList.setAdapter(mAdapter);
//in other/same lifecycle callbacks
getLoaderManager().initLoader(ID, null, this);

我正在使用支持库 v18。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    为避免onLoadFinished 被多次调用,请在onResume 中初始化加载程序。

    【讨论】:

    • 正如我上面提到的在 onResume() 中调用它也会导致双重调用。
    【解决方案2】:

    我在 onCreate 中调用它,据我所知这是最佳实践...... 我现在正在使用它,一切正常。

    @Override
        protected void onCreate(Bundle savedInstanceState)
    
                                 .......
    
              getSupportLoaderManager().initLoader(LOADER_ID, null, this);
    
                                 .......
    }
    

    【讨论】:

    【解决方案3】:

    在你的片段中调用onActivityCreated(Bundle savedInstanceState)

    getLoaderManager().initLoader(LOADER_ID, new Bundle(), this);
    

    【讨论】:

    【解决方案4】:

    在初始化加载器之前检查 savedInstanceState 怎么样。

    if (savedInstanceState == null)
        getLoaderManager().initLoader(LOADER_ID, null, this);
    

    【讨论】:

      【解决方案5】:

      getLoaderManager 不推荐使用 LoaderManager.getInstance(this).initLoader(0,null,this);

      改为

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 2012-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-18
        相关资源
        最近更新 更多