在阅读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]);
}
}
}
答案 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
可能会因为记忆压力而在后台被杀死