调用 replace() 时片段的生命周期是啥?
Posted
技术标签:
【中文标题】调用 replace() 时片段的生命周期是啥?【英文标题】:What is the lifecycle of a fragment when replace() is called?调用 replace() 时片段的生命周期是什么? 【发布时间】:2014-10-01 22:12:24 【问题描述】:我有一些使用以下代码动态添加的片段:
private class DrawerItemClickListener implements ListView.OnItemClickListener
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
selectItem(position);
private void selectItem(int position)
// update the main content by replacing fragments
Fragment fragment = null;
if(position == 0)
fragment = new FirstFragment();
else if(position == 1)
fragment = new SecondFragment();
else if(position == 2)
fragment = new ThirdFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mCalculatorTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
在我的一个片段中,我有一个计时器,我刚刚发现当片段被替换时,旧片段中的计时器仍在运行。我应该在片段生命周期的哪个位置终止计时器?
编辑:
好的,所以我在片段的 onStop() 方法中添加了 timer.cancel(),但是当我从操作栏上的按钮加载首选项时,也会调用 onStop()。这不是预期的效果。还有其他想法吗?
【问题讨论】:
签出 - androidlearnersite.wordpress.com/2017/02/27/… ..它解释了片段交易期间的片段生命周期与最新的 appcompat 版本 【参考方案1】:我会杀死 onStop()
中的任何计时器或异步工作
http://developer.android.com/guide/components/fragments.html#Lifecycle
引用 API 文档:
已停止 片段不可见。主机活动已停止或片段已从活动中删除但已添加 到后栈。停止的片段仍然存在(所有状态和 会员信息由系统保留)。然而,它不是 对用户可见的时间更长,如果活动被终止,将被杀死 被杀了。
片段生命周期:
【讨论】:
好吧,这似乎与正在发生的事情相关,但是当片段在同一个活动中被替换时,是否有任何东西被调用? 替换片段时应该调用所有这些。证明这一点的一种方法是覆盖每个生命周期方法并Log
它们。然后您可以观看各种回调。希望对您有所帮助。
抱歉,我没有问对问题。是否只有在替换片段时才会调用任何内容?我还在顶部加载首选项活动,我真的不希望计时器在此期间停止。但是 onStop() 会被调用。
没有特定于replace()
,没有。但是您可以使用您的片段实现的方法onReplace()
创建自己的名为Replaceable
的接口,并在调用FragmentTransaction.replace()
时直接调用它。【参考方案2】:
定时器任务与片段生命周期无关。 当您使用该片段完成工作时,您可以取消计时器。 Fragment 的 onStop 方法是这样做的好地方。
public void onStop()
super.onStop();
timer.cancel();
【讨论】:
这是我的第一个想法,但并不完全正确,当我在顶部添加新活动时也会调用 onStop(),请参阅我的编辑。以上是关于调用 replace() 时片段的生命周期是啥?的主要内容,如果未能解决你的问题,请参考以下文章