我正在尝试保存我的应用程序的游戏状态,以便在重新启动应用程序后重新加载。我试图保存的对象非常复杂并且包含大量数据。我一直在寻找不同的解决方案,并尝试了很多。
我最接近的是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;
}
答案 0 :(得分:0)
为什么您无法使用AsyncTask
http://www.vogella.com/tutorials/AndroidBackgroundProcessing/article.html来实现此目标
答案 1 :(得分:0)
我实际上刚刚在课堂上讨论了这个问题。 Android有一个内置的自动保存功能,应该在退出时保存您的数据...问题:您如何关闭/退出应用程序?我问这个是因为我相信如果您没有使用sqlLIte存储过程,数据会存储在您的RAM中...如果是这种情况...您退出应用程序的方式很重要并且可能正在删除您的数据...您可以尝试在用户失去焦点时保存所有数据
if blah.lostfocus
yourData .store value
如果你提到应用程序崩溃,你应该使用持久存储的方法。
点击此链接向您展示如何 - Here