android应用中的数据模型保存

android应用中的数据模型保存,android,mvp,parcelable,Android,Mvp,Parcelable,目前我正在编写android应用程序,它的主要功能就是在屏幕上画画。主要问题是如何存储应用程序的数据模型。最佳做法是什么? 当前数据模型如下所示: public class BoardModel { public Bitmap mBoard; public int mLineWidth = 1; public int mForegroundColor = Color.GREEN; public int mBackgroundColor = Color.BLACK; } protected v

目前我正在编写android应用程序,它的主要功能就是在屏幕上画画。主要问题是如何存储应用程序的数据模型。最佳做法是什么? 当前数据模型如下所示:

public class BoardModel {
public Bitmap mBoard;

public int mLineWidth = 1;
public int mForegroundColor = Color.GREEN;
public int mBackgroundColor = Color.BLACK;
}
protected void onSaveInstanceState(Bundle outState) {
    outState.putParcelable(KEY_MODEL, mModel);
}
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
        mModel = new BoardModelParcelable();
    } else {
        mModel = savedInstanceState.getParcelable(KEY_MODEL);
    }       
}
当调用主活动的onCreate方法时,将实例化此类。在其生命周期中,活动可能会被销毁。例如,当用户将设备方向从纵向更改为横向时,就会发生这种情况。因此,要存储我的模型,我将覆盖SaveInstanceState,如下所示:

public class BoardModel {
public Bitmap mBoard;

public int mLineWidth = 1;
public int mForegroundColor = Color.GREEN;
public int mBackgroundColor = Color.BLACK;
}
protected void onSaveInstanceState(Bundle outState) {
    outState.putParcelable(KEY_MODEL, mModel);
}
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
        mModel = new BoardModelParcelable();
    } else {
        mModel = savedInstanceState.getParcelable(KEY_MODEL);
    }       
}
并修改了onCreate方法,如下所示:

public class BoardModel {
public Bitmap mBoard;

public int mLineWidth = 1;
public int mForegroundColor = Color.GREEN;
public int mBackgroundColor = Color.BLACK;
}
protected void onSaveInstanceState(Bundle outState) {
    outState.putParcelable(KEY_MODEL, mModel);
}
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
        mModel = new BoardModelParcelable();
    } else {
        mModel = savedInstanceState.getParcelable(KEY_MODEL);
    }       
}
我还添加了以下类来实现Parcelable接口

public class BoardModelParcelable extends BoardModel implements Parcelable{
....
}

问题是,当我向模型添加任何数据时,我必须修改BoardModelParcelable来存储它。例如,我计划添加一个类来描述仪器,用于绘制一些东西。在这种情况下,我需要为instrument创建另一个类,它实现了Parcelable接口?或者我应该在BoardModelParcelable中存储仪器数据吗?看来我必须实现太多的可包裹对象。您知道如何在不创建保存代码的情况下存储模型数据吗?

您可以使用不带UI的片段在活动重新创建之间保存数据。您必须调用
setRetainInstance(true)
来告诉框架在配置更改期间保留此片段。因此,在配置更改之后,将重新创建活动,但此片段将与您的所有数据保持在以前的状态。关于这个主题的文章非常好:


自从安卓3.0引入片段以来,建议在活动实例中保留活动对象的方法是在保留的“worker”中包装和管理它们“碎片。默认情况下,当配置发生更改时,将销毁并重新创建片段及其父活动。调用Fragment#setRetainInstance(true)允许我们绕过此销毁和重新创建循环,在重新创建活动时向系统发出保留片段当前实例的信号。“

您可以使用不带UI的Fragment在活动重新创建之间保存数据。您必须调用
setRetainInstance(true)
告诉框架在配置更改期间保留此片段。因此,在配置更改后,将重新创建活动,但此片段将与您的所有数据保持在以前的状态。关于此主题的文章非常好:

自从安卓3.0引入片段以来,跨活动实例保留活动对象的推荐方法是将它们包装并管理在保留的“工作者”片段中。默认情况下,当配置发生更改时,将销毁并重新创建片段及其父活动。调用Fragment#setRetainInstance(true)允许我们绕过此销毁和重新创建循环,并在重新创建活动时通知系统保留片段的当前实例。”