【问题标题】:Why won't my object save to persistent storage?为什么我的对象不能保存到持久存储?
【发布时间】:2015-09-19 02:00:11
【问题描述】:

我有一个复杂的对象,我们可以称之为MyComplexObject。我想将其保存到持久存储中,以便在应用程序被销毁和重新创建后可以检索它。我正在使用这些方法在活动之间传递我的对象(保存在一个活动中并在下一个活动中加载)。我还想在应用程序被销毁时保存对象(可能在onStop() 覆盖中) 我可以在活动之间成功加载和保存我的对象,但由于某种原因,如果我在手机上销毁应用程序并重新启动它,总是会创建一个新的 MyComplexObject 并且它无法加载在销毁之前保存的对象!

我的对象包含多个包含多个对象的对象 - 所有这些对象都实现了Serializable

关于如何以一种允许我在应用被销毁/重新创建后保留玩家信息的方式保存/加载我的对象的任何想法?

即使在onDestroy() 和/或onStop() 上,我也会收到该对象确实已保存的通知!所以我不确定为什么在重新创建应用程序时它无法加载它。

 public static MyComplexObject Load(Context context){
        try{
            FileInputStream fis = context.getApplicationContext().openFileInput("player1.data");
            ObjectInputStream is = new ObjectInputStream(fis);
            MyComplexObject Game = (MyComplexObject) is.readObject();
            is.close();
            fis.close();
            return Game;
        }catch (Exception e){
            Log.e("Load", "creating new game - \n" + e.toString());
            MyComplexObject NewGame = MyComplexObject();
            return NewGame;
        }
    }


    public static void Save(Context context,MyComplexObject Game){
        try{
            FileOutputStream fos = context.getApplicationContext().openFileOutput("player1.data", Context.MODE_PRIVATE);
            ObjectOutputStream os = new ObjectOutputStream(fos);
            os.writeObject(Game);
            os.close();
            fos.close();
        }catch (Exception e){
            Log.e("Save", "Failed to save - \n" + e.toString());
        }
    }

这是日志:

07-01 14:24:11.824    3304-3304/? E/#Load﹕ creating new world -
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

这是我的 onCreate() sn-p:

MyComplexObject Game;

      @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Game =  LoadGame.Load(this);  //LoadGame is the class with Load(),Save()
    }

【问题讨论】:

  • 崩溃的日志是什么?
  • 它根本不会崩溃。一切正常,除非我重新启动应用程序(从进程菜单关闭应用程序并从应用程序抽屉重新打开它)它总是返回 NewGame 而不是我在应用程序终止时保存的游戏onStop()@yshahak
  • 那么异常的日志是什么?
  • 可以使用数据库吗?
  • @yshahak 我已经在上面添加了日志^

标签: java android serialization persistent-storage


【解决方案1】:

尝试:

public static MyComplexObject Load(Context context){
    try{
        FileInputStream fis = context.openFileInput("player1.data");
        ObjectInputStream is = new ObjectInputStream(fis);
        MyComplexObject Game = (MyComplexObject) is.readObject();
        is.close();
        fis.close();
        return Game;
    }catch (Exception e){
        Log.e("Load", "creating new game - \n" + e.toString());
        MyComplexObject NewGame = MyComplexObject();
        return NewGame;
    }
}

或:

public static MyComplexObject Load(Context context){
    try{
        FileInputStream fis = context.getApplication().openFileInput("player1.data");
        ObjectInputStream is = new ObjectInputStream(fis);
        MyComplexObject Game = (MyComplexObject) is.readObject();
        is.close();
        fis.close();
        return Game;
    }catch (Exception e){
        Log.e("Load", "creating new game - \n" + e.toString());
        MyComplexObject NewGame = MyComplexObject();
        return NewGame;
    }
}

【讨论】:

  • 成功了!正如您在第一个建议中所说的那样,更改为context.openFileInput("player1.data")。非常感谢。任何想法为什么我的原始线路不起作用? (为了学习)
  • 我认为 getApplicationContext() 使用某种包含额外内容的上下文,并且在您调用 getApplicationContext() 时,Application 类没有足够的时间来生成此 Wrapper,但这可能错了,这只是猜测
  • 我真的不想警告你我对 Serializable 的体验不好,因为我没有向 proguard ffile 添加正确的设置,并且当我更新我的应用程序版本时,我遇到了与旧版。采取另一种方法或真正阅读有关 proguard 需要调整
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 2021-06-24
相关资源
最近更新 更多