setRetainInstance with Fragment

时间:2014-10-06 19:50:11

标签: android android-fragments

在阅读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]);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

Fragment的实例将被保留 - 但View创建的Fragment仍将被销毁并重新创建,除非明确保留(这很容易导致内存泄漏) )。基本上,如果没有setRetainInstance(),配置更改将发生以下事件(以及其他事件):

// Fragment initialized
onCreate()
onCreateView()

// Configuration change
onDestroyView()
onDestroy()
onCreate()
onCreateView()

使用setRetainInstance(true)

// Fragment initialized
onCreate()
onCreateView()

// Configuration change
onDestroyView()
onCreateView()

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

你应该仍然能够处理 重置的情况,但是,即使使用setRetainInstance(true),你的Activity可能会因为记忆压力而在后台被杀死