Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.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 带碎片的setRetainInstance_Android_Android Fragments - Fatal编程技术网

Android 带碎片的setRetainInstance

Android 带碎片的setRetainInstance,android,android-fragments,Android,Android Fragments,在阅读android书籍时获得以下示例。有人能告诉我为什么在这个例子中总是创建适配器吗?难道不应该只在model==null的情况下执行吗? 如果我理解正确,所有数据成员都将被保留(在本例中),那么ListView将与其配置的ListAdapter和其他所有内容一起被保留 public class AsyncDemoFragment extends SherlockListFragment { private static final String[] items = { "lorem"

在阅读android书籍时获得以下示例。有人能告诉我为什么在这个例子中总是创建适配器吗?难道不应该只在model==null的情况下执行吗? 如果我理解正确,所有数据成员都将被保留(在本例中),那么ListView将与其配置的ListAdapter和其他所有内容一起被保留

public class AsyncDemoFragment extends SherlockListFragment {
    private static final String[] items = { "lorem", "ipsum", "dolor" };

    private ArrayList<String> model = null;
    private ArrayAdapter<String> adapter = null;

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        setRetainInstance(true);

        if (model == null) {
            model = new ArrayList<String>();

            new AddStringTask().execute();
        }

        adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, model);
        setListAdapter(adapter);
    }

    class AddStringTask extends AsyncTask<Void, String, Void> {

        // …

        protected void onProgressUpdate(String... item) {
            adapter.add(item[0]);
        }
    }
}
公共类AsyncDemoFragment扩展SherlockListFragment{
私有静态最终字符串[]项={“lorem”、“ipsum”、“dolor”};
私有ArrayList模型=null;
专用ArrayAdapter适配器=null;
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
setRetainInstance(真);
if(model==null){
模型=新的ArrayList();
新建AddStringTask().execute();
}
adapter=newarrayadapter(getActivity(),android.R.layout.simple\u list\u item\u 1,model);
setListAdapter(适配器);
}
类AddStringTask扩展了AsyncTask{
// …
受保护的void onProgressUpdate(字符串…项){
添加(第[0]项);
}
}
}

您的
片段的实例将被保留——但是,由
片段创建的
视图仍将被销毁并重新创建,除非特别保留(这很容易导致内存泄漏)。基本上,如果没有
setRetainInstance()
,配置更改时将发生以下事件(以及其他事件):

// Fragment initialized
onCreate()
onCreateView()

// Configuration change
onDestroyView()
onDestroy()
onCreate()
onCreateView()
使用
setRetainInstance(true)

基本上,您仍然需要重新创建
视图
,但不会重置任何其他实例字段


但是,您应该仍然能够处理它们被重置的情况,因为即使使用
setRetainInstance(true)
您的
活动也可能由于内存压力而在后台被终止。

您的
片段的实例将被保留,由
片段创建的
视图
仍将被销毁并重新创建,除非特别保留(这很容易导致内存泄漏)。基本上,如果没有
setRetainInstance()
,配置更改时将发生以下事件(以及其他事件):

// Fragment initialized
onCreate()
onCreateView()

// Configuration change
onDestroyView()
onDestroy()
onCreate()
onCreateView()
使用
setRetainInstance(true)

基本上,您仍然需要重新创建
视图
,但不会重置任何其他实例字段


但是,您应该仍然能够处理它们被重置的情况,因为即使使用
setRetainInstance(true)
您的
活动也可能由于内存压力而在后台被终止。

您的
片段的实例将被保留,由
片段创建的
视图
仍将被销毁并重新创建,除非特别保留(这很容易导致内存泄漏)。基本上,如果没有
setRetainInstance()
,配置更改时将发生以下事件(以及其他事件):

// Fragment initialized
onCreate()
onCreateView()

// Configuration change
onDestroyView()
onDestroy()
onCreate()
onCreateView()
使用
setRetainInstance(true)

基本上,您仍然需要重新创建
视图
,但不会重置任何其他实例字段


但是,您应该仍然能够处理它们被重置的情况,因为即使使用
setRetainInstance(true)
您的
活动也可能由于内存压力而在后台被终止。

您的
片段的实例将被保留,由
片段创建的
视图
仍将被销毁并重新创建,除非特别保留(这很容易导致内存泄漏)。基本上,如果没有
setRetainInstance()
,配置更改时将发生以下事件(以及其他事件):

// Fragment initialized
onCreate()
onCreateView()

// Configuration change
onDestroyView()
onDestroy()
onCreate()
onCreateView()
使用
setRetainInstance(true)

基本上,您仍然需要重新创建
视图
,但不会重置任何其他实例字段



但是,您应该仍然能够处理它们被重置的情况,因为即使使用
setRetainInstance(true)
您的
活动也可能由于内存压力而在后台被终止。

谢谢您的回复。但我想澄清一下。具有setRetainInstance(true)的片段是否会销毁其所有视图对象?如果是-则适配器实例仍将保留。对的因此,如果存在(如果(model==null)),则不必再次创建它。否?如果(model==null)将adapter=new ArrayAdapter放在块中不是更好吗?这样它就不会在新实例存在的情况下创建新实例了…正确,您应该显式释放onDestroyView()中的所有视图引用以避免活动引用泄漏。事实上,我会在
onDestroyView()
中显式地将适配器引用设为null(因为适配器持有对活动实例的强引用,该实例正在被销毁,以便扩大项目视图)。保留模型,但在重新创建视图时重新创建适配器。现在,在您的解释之后,我理解了这个想法,但在我之前尝试运行上面的示例时,仍然不确定流程,保持适配器而不重新创建它(在if块内),它工作得很好。在这种情况下,您将如何定义预期的行为?它不是应该崩溃吗?不,它不会崩溃,你只会泄漏内存。谢谢你的回复。但我想澄清一下。具有setRetainInstance(true)的片段是否会销毁其所有视图对象?如果是-则适配器实例仍将保留。对的因此,如果存在(如果(model==null)),则不必再次创建它。否?如果(model==null)将adapter=new ArrayAdapter放在块中不是更好吗?这样它就不会在新实例存在的情况下创建新实例…正确,您应该显式释放onDestroyView()中的所有视图引用以避免活动泄漏