暂停 activity 或片段时保存加载的数据
Saving loaded data when pausing an activity or fragment
我一直在从服务器加载数据并将其呈现在列表视图或网格视图中,但每次我暂停 activity 或最小化它时,当我返回到上述 [=15] 时,数据会重新加载=].
我知道可以在 onSaveInstanceState 中保存字符串、整数或布尔值,但是有没有办法保存其他数据对象,例如对象的 ArrayLists,请记住一些片段嵌套在其他片段中,这使使用 setRetainInstance(true) 不可行?
这里是 link 官方 android 指南来处理这个问题
http://developer.android.com/guide/topics/resources/runtime-changes.html
基本上,您将数据(对象的 ArrayList)保存在片段中,当 Activity 恢复时,您从片段中检索数据。
片段不会在 Activity 更改状态之间或运行时更改期间被销毁。
您的 Fragment 应如下所示:
public class RetainedFragment extends Fragment {
// data object we want to retain
private ArrayList<YourObject> data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(ArrayList<YourObject> data) {
this.data = data;
}
public ArrayList<YourObject> getData() {
return data;
}
}
还有你的 onDestroy() 方法:
@Override
public void onDestroy() {
super.onDestroy();
// store the data in the fragment
dataFragment.setData(collectMyLoadedData());
}
你的 onCreate() 方法应该是相同的,唯一的区别是你如何在这一行加载数据:
dataFragment.setData(loadMyData());
对于嵌套片段问题,请检查此 link http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en
如果您想将数据保存在片段中,请调用片段中的方法setRetainInstance( )
,这样您的片段就不会在运行时更改期间被破坏,
您可以通过将自定义对象打包并写入到 activity 的 onSaveInstanceState
回调方法中来保存自定义对象,并在 onCreate
或 OnRestart
回调中检索它。
我希望这个 blog post 可以帮助您详细了解事情
简短的回答是肯定的,您可以将任何内容保存到 onSaveInstanceState 中,只要您确保它实现 Parcelable or Serializable.
更长但可能更好的解决方案是使用 LoaderManager 回调从 Internet 加载您的内容。这将您的数据与 activity 生命周期分离,使您免于运行时更改带来的许多痛苦。
我一直在从服务器加载数据并将其呈现在列表视图或网格视图中,但每次我暂停 activity 或最小化它时,当我返回到上述 [=15] 时,数据会重新加载=].
我知道可以在 onSaveInstanceState 中保存字符串、整数或布尔值,但是有没有办法保存其他数据对象,例如对象的 ArrayLists,请记住一些片段嵌套在其他片段中,这使使用 setRetainInstance(true) 不可行?
这里是 link 官方 android 指南来处理这个问题 http://developer.android.com/guide/topics/resources/runtime-changes.html
基本上,您将数据(对象的 ArrayList)保存在片段中,当 Activity 恢复时,您从片段中检索数据。
片段不会在 Activity 更改状态之间或运行时更改期间被销毁。
您的 Fragment 应如下所示:
public class RetainedFragment extends Fragment {
// data object we want to retain
private ArrayList<YourObject> data;
// this method is only called once for this fragment
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// retain this fragment
setRetainInstance(true);
}
public void setData(ArrayList<YourObject> data) {
this.data = data;
}
public ArrayList<YourObject> getData() {
return data;
}
}
还有你的 onDestroy() 方法:
@Override
public void onDestroy() {
super.onDestroy();
// store the data in the fragment
dataFragment.setData(collectMyLoadedData());
}
你的 onCreate() 方法应该是相同的,唯一的区别是你如何在这一行加载数据:
dataFragment.setData(loadMyData());
对于嵌套片段问题,请检查此 link http://inthecheesefactory.com/blog/fragment-state-saving-best-practices/en
如果您想将数据保存在片段中,请调用片段中的方法setRetainInstance( )
,这样您的片段就不会在运行时更改期间被破坏,
您可以通过将自定义对象打包并写入到 activity 的 onSaveInstanceState
回调方法中来保存自定义对象,并在 onCreate
或 OnRestart
回调中检索它。
我希望这个 blog post 可以帮助您详细了解事情
简短的回答是肯定的,您可以将任何内容保存到 onSaveInstanceState 中,只要您确保它实现 Parcelable or Serializable.
更长但可能更好的解决方案是使用 LoaderManager 回调从 Internet 加载您的内容。这将您的数据与 activity 生命周期分离,使您免于运行时更改带来的许多痛苦。