Android 反压上的碎片刷新
我有一个活动Android 反压上的碎片刷新,android,android-fragments,Android,Android Fragments,我有一个活动MainActivity有三个片段与此活动关联 现在,我的一个片段时间线有一个列表视图。我从后端的数据库中填充它。我使用AsyncTask从数据库中获取值并将它们处理到列表中。我在片段时间线的onCreate中触发这个异步任务 现在,从时间线单击任何列表项,我将导航到一个不同的活动,称为详细活动 问题是,每当我从DetailActivity按back键时,我的main活动的onCreate会被调用,我的列表会再次刷新-整个DB操作会再次调用,我的列表不会保留其状态 在我离开片段之前,
MainActivity
有三个片段与此活动关联
现在,我的一个片段时间线有一个列表视图。我从后端的数据库中填充它。我使用AsyncTask从数据库中获取值并将它们处理到列表中。我在片段时间线的onCreate中触发这个异步任务
现在,从时间线
单击任何列表项,我将导航到一个不同的活动
,称为详细活动
问题是,每当我从DetailActivity
按back键时,我的main活动的onCreate会被调用,我的列表会再次刷新-整个DB操作会再次调用,我的列表不会保留其状态
在我离开片段之前,我正在计算列表中的可见项,但我被迫对这些变量使用静态值,以便保留位置。如何避免这种情况
下面是我的onPause和onResume的片段,如片段时间线所示
static int index;
static int top;
@Override
public void onPause(){
System.out.println("onPause");
index = lv.getFirstVisiblePosition();
View v = lv.getChildAt(0);
top = (v == null) ? 0 : v.getTop();
super.onPause();
uiHelper.onPause();
}
@Override
public void onResume(){
super.onResume();
//dbHelper.open();
System.out.println("onResumr");
lv.setSelectionFromTop(index, top);
ActionBar actionBar = getActivity().getActionBar();
actionBar.setTitle("Timeline");
uiHelper.onResume();
AppEventsLogger.activateApp(getActivity());
updateUI();
}
这也迫使我的AsyncTask一次又一次地运行,这是一种开销
编辑:
这个问题的根源——在挣扎了这么多天之后,我借了一部朋友的手机进行测试,所有的东西都在这部新手机上整理好了。我发现我在开发人员设置中打开了不保留活动
选项。愚蠢的我 不幸的是,这是片段
类的默认行为。每当包含的活动暂停时,片段将被销毁,每当包含的活动恢复时,片段将被重新创建。如果对列表使用活动
而不是片段
,则不会出现相同的行为。使用活动
:
AsyncTask
s和/或web服务将不会再次调用
- 该列表将显示以前滚动的位置
如果希望片段具有相同的行为,则需要重写onSaveInstanceState()
方法。虽然很有趣,但这不是一个小的工作量
编辑:
确保在手机的开发者设置中未选中“不保留活动”
选项。但是,这并没有改变我上面概述的片段
类的基本行为。您可以对片段调用setRetainInstance(true)
。但生命周期将略有不同
这里可以看到片段生命周期的清晰视图
setRetainInstance(true)
适用于配置更改,如旋转和ViewPager
滑动。setRetainInstance(true)
即使用户离开了活动
,也能正常工作吗?不,我在发布问题之前已经试过了!显示您的main活动
代码以及它如何创建/管理片段
。代码太长,无法在此发布!我仍将尝试浏览相关LOC!同意,现在我有30分钟的时间启动,我将坚持使用我的静态变量!好了,杜德特:)@zyteinit:你有证据证明这一点吗?我什么也找不到。一个活动
可以通过出现一个对话框(例如)来暂停,并且活动
保持部分可见,并附有任何片段
。当对话框消失时,活动
将恢复,我在我的应用程序中看不到任何迹象表明片段
已被销毁/重新创建。虽然我在寻找一些链接,但我可以将其作为“记录在案的同行评审证据”,我可以指出OP的问题确实是这种行为的证据,这是我在使用Fragment
s时看到的。使用Activity
s实现时,相同的UI显示了我所描述的行为:不再调用web服务/asynctasks,并且在按backpress时自动保持listview滚动位置。您可以通过列表详细信息流自己验证此行为-首先使用片段
s,然后使用活动
s这一问题的根源-经过这么多天的努力,我借用了一部friends手机进行测试,并在这部新手机上进行了排序。我发现我在开发人员设置中打开了不保留活动
选项。愚蠢的我!!