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手机进行测试,并在这部新手机上进行了排序。我发现我在开发人员设置中打开了
不保留活动
选项。愚蠢的我!!