将对象放入包中

时间:2014-07-15 11:46:05

标签: android object bundle instance

问候,

我有一个游戏,我想将在画布上移动的对象(创作者)保存到一个包中,以便当有人暂停/离开应用程序时,对象可以保持原样。

我看过LunarLanding游戏,他们将航天飞机的坐标保存成束并从中读取,我想要做同样的事情(如果没有更好的方法)但我有自定义类型的对象,我不知道如何保存它们并从捆绑中读取。

我可以单独保存对象的所有部分并将它们重新组合在一起,但是我有很多对象,这只是丑陋的代码来完成所有这些。

如果我可以将对象保存到捆绑包中,那将是非常好的,但到目前为止,我没有运气在互联网上搜索如何这样做。

我还在考虑向我的对象实现Parcelable,但我想知道是否还有其他方法。

有什么建议吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

基本上你有两个选择

1 - 实现Serializable,实现起来非常简单,但有一个不好的缺点就是性能。

2 - 实现Parcelable,非常快,但你需要实现解析器方法(writeToParcel()),基本上你必须手动序列化,但之后bundle会为你自动调用它产生更多的性能序列化。

答案 1 :(得分:1)

从技术上讲,如果我没记错的话,onSaveInstanceState()方法主要仅在方向更改时调用。如果要创建持久数据,则应使用onPause()或onStop()回调,并序列化游戏状态。

你可以这样做的方法是将状态存储在SQLite数据库中(似乎是过度杀伤),或者使它能够通过实现Serializable interface来序列化跟踪实体的对象,以及将对象保存到文件中。

序列化:

@Override
public void onPause()
{
    super.onPause();
    FileOutputStream out = null;
    try
    {
        out = openFileOutput("GameModelBackup",Context.MODE_PRIVATE);

        try
        {
            ObjectOutputStream oos = new ObjectOutputStream(out);
            oos.writeObject(gm);
        }
        catch(IOException e)
        {
            Log.d(this.getClass().toString(), e.getMessage());
        }
    }
    catch(FileNotFoundException e)
    {
        Log.d(this.getClass().toString(), e.getMessage());
    }
    finally
    {
        try
        {
            if(out != null) out.close();
        }
        catch(IOException e)
        {
            Log.d(this.getClass().toString(), e.getMessage());
        }
    }
} 

反序列化:

@Override
public void onResume()
{
    super.onResume();
    FileInputStream in = null;
    try
    {
        in = openFileInput("GameModelBackup");
        ObjectInputStream oos = new ObjectInputStream(in);
        try
        {
            gm = (GameModel)oos.readObject();
        }
        catch(ClassNotFoundException e)
        {
            gm = null;
        }
    }
    catch(IOException e)
    {
        Log.d(this.getClass().toString(), e.getMessage());
    }
    finally
    {
        try
        {
            if(in != null) in.close();
        }
        catch(IOException e) {}
    }
}