片段刷新背压

时间:2015-02-26 09:39:18

标签: android android-fragments

我有一个活动MainActivity有三个与此活动相关的片段。

现在我的一个片段Timeline有一个列表视图。我从后端的数据库填充。我使用AsyncTask从数据库中获取值并将它们处理到List。我在片段Timeline的onCreate中触发此AsyncTask。

现在从Timeline点击任意列表项后,我导航到另一个Activity,称为DetailActivity

问题是每当我从DetailActivity按回{my} MainActivity的onCreate并且我的列表再次刷新时 - 再次调用整个数据库操作并且我的列表不保持其状态。

我在离开Fragment之前计算了List的可见项目,但是我被迫对这些变量使用静态值,以便保留位置。怎么避免这个?

以下是片段Timeline中列出的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一次又一次地运行,这是一个开销。

编辑:

这个问题的根源 - 经过这么多天的努力,我借了一个朋友的电话进行测试,所有这些都是在这款新手机上排序的。我发现我在开发者设置中打开了Do not keep Activities选项。愚蠢的我!!

2 个答案:

答案 0 :(得分:1)

不幸的是,这是Fragment类的默认行为。每当包含Fragment 暂停时,Activity 已销毁,并且只要包含Activity重新创建 已恢复。如果您使用Activity而不是Fragment作为列表,则不会遇到相同的行为。使用Activity

  • AsyncTask和/或Web服务不会再被调用。
  • 该列表将显示先前滚动的位置。

如果您希望Fragment具有相同的行为,则需要覆盖onSaveInstanceState()方法。虽然有趣,但这不是一件小事。

修改

确保在手机的“开发者设置”中取消选中Do not keep Activities选项。但是,这并没有改变我上面概述的Fragment类的基本行为。

答案 1 :(得分:1)

您可以在片段上调用setRetainInstance(true)。但生命周期会略有不同。

此处提供片段生命周期的精彩视图 http://corner.squareup.com/2014/10/advocating-against-android-fragments.html