Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android生命周期-数据不重新加载_Android_Android Listview_Android Lifecycle - Fatal编程技术网

Android生命周期-数据不重新加载

Android生命周期-数据不重新加载,android,android-listview,android-lifecycle,Android,Android Listview,Android Lifecycle,我一直在努力找出导致我的应用程序在两个ListViews中丢失数据的原因,两个选项卡中各有一个,这两个选项卡都是ListFragments。当您将应用程序推向最前沿时,手机上的列表视图会随机清空 我猜我在恢复应用程序时缺少了一些关于如何恢复数据的信息。通常,应用程序还原和两个选项卡中的数据都存在 然而,似乎只有在真正的手机上,数据才会从列表视图中消失,但我找不到可复制的模式 我使用DDMS以多种组合模拟垃圾收集,但我无法再现数据丢失。下面是我如何处理生命周期、简化和基本上完整的伪代码 我查看了生

我一直在努力找出导致我的应用程序在两个
ListView
s中丢失数据的原因,两个选项卡中各有一个,这两个选项卡都是
ListFragment
s。当您将应用程序推向最前沿时,手机上的
列表视图
会随机清空

我猜我在恢复应用程序时缺少了一些关于如何恢复数据的信息。通常,应用程序还原和两个选项卡中的数据都存在

然而,似乎只有在真正的手机上,数据才会从
列表视图中消失,但我找不到可复制的模式

我使用DDMS以多种组合模拟垃圾收集,但我无法再现数据丢失。下面是我如何处理生命周期、简化和基本上完整的伪代码

我查看了生命周期结构,认为它可以正常工作

我提神不正确吗

主要活动

public class MyActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // I don't refresh here
        // add both tabs to the tab adapter
    }

    public void onRestart() {
        super.onRestart(); 
        reloadTab1();
        reloadTab2();
    }
}
表1

public class MyTab1 extends ListFragment {
    static MyTab1Adapter mAdapter;
    ArrayList<MyObject> mItems;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain state
        setRetainInstance(true);
        reloadTab1(getActivity());
    }

    public void reloadTab1(Context context) {
        mItems = updateItems();

        if (mAdapter == null) {
            mAdapter = new MyTab1Adapter(context, R.layout.tab1, mItems);
            setListAdapter(mAdapter);
        }           
        else {
            mAdapter.setNewList(mItems);
            mAdapter.notifyDataSetChanged();
        }
    }
}
公共类MyTab1扩展了ListFragment{
静态MyTab1Adapter mAdapter;
柱叶螨;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//保留状态
setRetainInstance(真);
重新加载tab1(getActivity());
}
公共void重载tab1(上下文){
mItems=updateItems();
if(mAdapter==null){
mAdapter=新的MyTab1Adapter(上下文,R.layout.tab1,mItems);
setListAdapter(mAdapter);
}           
否则{
mAdapter.setNewList(mItems);
mAdapter.notifyDataSetChanged();
}
}
}
表2

public class MyTab2 extends ListFragment {
    static MyTab2Adapter mAdapter;
    ArrayList<MyObject> mItems;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain state
        setRetainInstance(true);
        reloadTab2(getActivity());
    }

    public void reloadTab2(Context context) {
        mItems = updateItems();

        if (mAdapter == null) {
            mAdapter = new MyTab2Adapter(context, R.layout.tab2, mItems);
            setListAdapter(mAdapter);
        }           
        else {
            mAdapter.setNewList(mItems);
            mAdapter.notifyDataSetChanged();
        }
    }
}
公共类MyTab2扩展了ListFragment{
静态MyTab2Adapter mAdapter;
柱叶螨;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//保留状态
setRetainInstance(真);
重新加载tab2(getActivity());
}
公共void重载tab2(上下文){
mItems=updateItems();
if(mAdapter==null){
mAdapter=newmytab2adapter(上下文,R.layout.tab2,mItems);
setListAdapter(mAdapter);
}           
否则{
mAdapter.setNewList(mItems);
mAdapter.notifyDataSetChanged();
}
}
}

您的代码中有一个小的输入错误,您使用了
onRestart
回调,但从超类调用了
onResume
方法,而不是
super.onRestart()

我想这只是一个输入错误,但是
onRestart
并调用
super.onResume()
?我实际上刚刚注意到了这一点,这是我应用程序中的一个错误。也许这会解决问题,我们拭目以待。好的捕获方法如果您正在重新启动时使用
onRestart
,则不会调用该回调,除非该活动在后台被终止<每次都会调用code>onResume
,因此每次返回活动时都应该刷新片段。我正在尽可能减少对getView的调用次数。今晚我将花一些时间,看看是否能从
onResume
中获得可接受的结果。感谢您对我的问题感兴趣。我不知道您打算如何减少
getView
呼叫的数量。如果调用
notifyDataSetChanged
将调用
getView
方法,因为适配器知道其数据已更改。一个小的优化是以某种方式查看数据是否真的发生了更改(但这取决于您的实现),然后调用
notifyDataSetChanged