Android - 应用程序关闭后保存和加载对象时出现问题

时间:2014-03-05 11:06:47

标签: java android save

我正在尝试保存我的应用程序的游戏状态,以便在重新启动应用程序后重新加载。我试图保存的对象非常复杂并且包含大量数据。我一直在寻找不同的解决方案,并尝试了很多。

我最接近的是App能够在运行时保存和加载数据。 当关闭并重​​新启动应用程序时,它有时会成功加载数据,但只是在非常罕见的时刻。

有人知道问题可能是什么吗?

我试图保存的Object看起来如下(我遗漏的不重要的功能):

public class SCSpieldaten  implements Serializable {

    private static final long serialVersionUID = 1L;
    //Aktuelles Spiel
    /////////////////////////////////////////////////////////////////////////////////////////
    public static Random rand = new Random();
    public static int EinTabletBedienung        = 1;
    public static int KartePortLand             = 0;
    public static int AktuelleRunde             = 0;
    public static int AktiverSpieler            = 0;
    public static int AktivesDorf               = 0;
    public static int AktuellerBauplatz         = 1;
    public static int AktuellStaerksterMacht[]  = {KEINEANGABE,KEINEANGABE,KEINEANGABE};
    public static int SelektiertePositionX      = 0;
    public static int SelektiertePositionY      = 0;
    public static int AktuellesFeld             = 1;
    public static int AktuellesGebaeude         = 1;
    public static int AktuellesGebiet           = 0;
    public static int AktuelleAnzahlUnit[]      = {0,0,0};
    public static int AktuellerEinheitentyp[]   = {KEINEANGABE,KEINEANGABE,KEINEANGABE};
    public static int AktuellerBericht          = 0;
    public static ArrayList<Integer> SpinnerBerichtNr           = new ArrayList<Integer>();
    public static ArrayList<ArrayAdapter<String>> ArrayAdapter  = new ArrayList<ArrayAdapter<String>>();
    public static ArrayList<CBericht> CB_AktuellerBericht       = new ArrayList<CBericht>();
    public static CKosten AktuelleKosten                        = new CKosten(0,0,0,0,0);
    public static CGebaeude TempGebaeude                        = new CGebaeude();
    public static ArrayList<CSpieler> CS_Spieler                = new ArrayList<CSpieler>();
    public static ArrayList<CNeutralesLager> CN_NeutralesLager  = new ArrayList<CNeutralesLager>();
    public static ArrayList<CWegzoll> CW_Wegzoll                = new ArrayList<CWegzoll>();
    public static CDorf CD_Handelsstadt                         = new CDorf(GEBIETNEUTRAL);
    public static CDorf CD_Festung                              = new CDorf(GEBIETNEUTRAL);
    public static CDorf CD_Forschungszentrum                    = new CDorf(GEBIETNEUTRAL);
    public static CUnterstuetzung CU_FestungVerteidigung        = new CUnterstuetzung();
    public static CUnterstuetzung CU_FestungStartArmee          = new CUnterstuetzung();
    public static Integer[][] SpielerStatistic                  = new Integer[6][100];  


public void save(Context c) throws IOException
{
    FileOutputStream fos = c.openFileOutput("test0.txt", Context.MODE_WORLD_WRITEABLE);
    ObjectOutputStream os = new ObjectOutputStream(fos);
    os.writeObject(this);
    os.close();
}

public SCSpieldaten load(Context c) throws IOException, ClassNotFoundException
{
    FileInputStream fis = c.openFileInput("test0.txt");
    ObjectInputStream is = new ObjectInputStream(fis);
    SCSpieldaten simpleClass = (SCSpieldaten) is.readObject();
    is.close();
    return simpleClass;
}

我也试过使用ObjectOutputStream但是在重新启动应用程序时,似乎文件已删除了

public boolean saveObject(SCSpieldaten obj) {
    File suspend_f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.txt");
    if(!suspend_f.exists())
    {
        try {
            suspend_f.createNewFile();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
    }               

    FileOutputStream   fos  = null;
    ObjectOutputStream oos  = null;
    boolean            keep = true;

    try {
        fos = new FileOutputStream(suspend_f);
        oos = new ObjectOutputStream(fos);
        oos.writeObject(obj);
    } catch (Exception e) {
        keep = false;
    } finally {
        try {
            if (oos != null)   oos.close();
            if (fos != null)   fos.close();
            if (keep == false) suspend_f.delete();
    } catch (Exception e) { /* do nothing */ }
    }

    return keep;
}

public SCSpieldaten getObject(Context c) {
    File suspend_f = new File(Environment.getExternalStorageDirectory() + File.separator + "test.txt");

    SCSpieldaten simpleClass= null;
    FileInputStream fis = null;
    ObjectInputStream is = null;

    try {
        fis = new FileInputStream(suspend_f);
        is = new ObjectInputStream(fis);
        simpleClass = (SCSpieldaten) is.readObject();
    } catch(Exception e) {
        String val= e.getMessage();
    } finally {
        try {
            if (fis != null)   fis.close();
            if (is != null)   is.close();
        } catch (Exception e) { }
    }

    return simpleClass;  
}

2 个答案:

答案 0 :(得分:0)

为什么您无法使用AsyncTask http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html来实现此目标

答案 1 :(得分:0)

我实际上刚刚在课堂上讨论了这个问题。 Android有一个内置的自动保存功能,应该在退出时保存您的数据...问题:您如何关闭/退出应用程序?我问这个是因为我相信如果您没有使用sqlLIte存储过程,数据会存储在您的RAM中...如果是这种情况...您退出应用程序的方式很重要并且可能正在删除您的数据...您可以尝试在用户失去焦点时保存所有数据

if blah.lostfocus
yourData .store value

如果你提到应用程序崩溃,你应该使用持久存储的方法。

点击此链接向您展示如何 - Here