我在研究Android应用程序处理方向更改的方式(我发现它会在方向更改时重启MainActivity)。我看到您可以覆盖该方法
protected void onSaveInstanceState(Bundle outState)
在onStart()方法中保存数据。问题是我有一个带有自定义对象的视图和使用自定义适配器的ListView。所有内容都在这些对象的ArrayList中,但我发现无法将任意对象放入Bundle中! 那么我该如何保存状态?
我在研究Android应用程序处理方向更改的方式(我发现它会在方向更改时重启MainActivity)。我看到您可以覆盖该方法
protected void onSaveInstanceState(Bundle outState)
在onStart()方法中保存数据。问题是我有一个带有自定义对象的视图和使用自定义适配器的ListView。所有内容都在这些对象的ArrayList中,但我发现无法将任意对象放入Bundle中! 那么我该如何保存状态?
编辑:在新一代 Android 系统中,使用兼容库和保留片段通常是处理在活动销毁/创建过程中维护昂贵的可重建数据的最佳方式。正如 Dianne 指出的那样,保留非配置数据是为了优化诸如缩略图生成之类的性能好处而保存,但如果需要重新执行,则不会影响活动功能。它不能替代正确的保存和恢复活动状态。
但是,当我在2010年首次回答这个问题时:
如果您想保留自己的(非视图状态)数据,则可以使用 onRetainNonConfigurationInstance()
在屏幕旋转期间传递任意对象。请参见此Android Developers博客文章。只需小心,不要将任何视图或其他对旋转前上下文/活动的引用放在您传递的对象中,否则您将阻止这些对象被垃圾回收并可能最终耗尽内存(这称为上下文泄漏)。
首先,您需要确定您的应用程序中实际上是什么"状态"。虽然您没有具体说明您正在做什么,但让我假设对象ArrayList是用户正在使用的状态。
其次,决定此状态实际上的生命周期。它是否真的与该活动相关联?或者,如果用户的电池电量不足、设备关闭,并且稍后返回您的应用程序,则用户是否不会失去它?如果是前者,则onSaveInstanceState()
是正确的;如果是后者,则您将需要在onPause()
中保存到持久性存储。
对于自定义对象的onSaveInstanceState()
,关键是实现Parcelable
接口。这涉及实现Parcelable上的方法以及在类中创建静态CREATOR对象。下面是典型简单的Parcelable类的代码:
关键函数是Parcelable实现:
和CREATOR静态类:
(静态的writeToParcel()
和readFromParcel()
只是为该类完成的方便,不是必需的。)
Bundle.putParcelableArrayList
将整个对象的ArrayList放入已保存的状态Bundle中:
在Activity.onCreate()
中,检查是否有savedState Bundle
,如果有,则尝试从其中检索ArrayList并在找到时使用它,在新活动中创建一个新适配器和列表视图来显示它。import com.google.gson.Gson;
public class MyClass {
private int a;
private String s;
private OtherSerializableClass other;
private List<String> list;
public String toJson() {
return new Gson().toJson(this);
}
public static ChatAPI_MessagesArray fromJson(String json){
return new Gson().fromJson(json, YourClass.class);
}
// Getters
...
// Setters
...
}
但我注意到你不能将任意对象放入Bundle中!
首先将自定义对象实现 Parcelable 接口。
然后,您可以将它们放入 Bundle 中。
一切都在这些对象的 ArrayList 中
您可以使用 putParcelableArrayList
方法将自定义 "parcelable" 对象的 ArrayList 存储在 Bundle 中。
https://developer.android.com/topic/libraries/architecture/viewmodel
onSaveInstanceState
,onRestoreInstanceState
和onConfigurationChanged
等方法。解决问题有不同的方式,并且每种方式都有不同的解决问题的角度。 - Rahul Patil