参考までに、私はいくつかのオプションを考え出しました。
最も簡単な方法は、次のようにtoArrayを使用してArrayListをオブジェクトの単純な配列に書き込むことです。
static TTEvt evArray[];
public static void addUndoCheckpoint() {
long start = System.currentTimeMillis();
evArray = Doc.mEvList.toArray(new TTEvt[Doc.mEvList.size()]);
long end = System.currentTimeMillis();
Log.d("MainView", "addUndoCheckpoint time="+(end-start)+"mS");
}
public static void doUndo() {
Doc.mEvList.clear();
for(TTEvt ev : evArray)
Doc.mEvList.add(ev);
forceTotalRedraw();
}
更新:toArrayは、オブジェクト自体ではなく、オブジェクトへの参照の配列に対してのみ新しいものを実行するため、上記のコードが実際には機能していないことがわかりました。したがって、すべてのオブジェクトのクローンを作成する必要があります。これは明らかに大量のメモリであり、おそらく時間です。おそらく答えは以下の遅いオプションで、シリアル化を使用しますが、UIが遅くならないように、同期スレッドで実行します。
このようなスペースを節約するためにgzip圧縮を使用するより複雑な方法
static byte[] undoBuf;
public static void addUndoCheckpoint() {
long start = System.currentTimeMillis();
//evArray = Doc.mEvList.toArray(new TTEvt[Doc.mEvList.size()]);
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzipOut = new GZIPOutputStream(baos);
ObjectOutputStream objectOut = new ObjectOutputStream(gzipOut);
for(TTEvt ev: Doc.mEvList)
objectOut.writeObject(ev);
objectOut.close();
undoBuf = baos.toByteArray();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long end = System.currentTimeMillis();
Log.d("MainView", "addUndoCheckpoint time="+(end-start)+"mS");
}
public static void doUndo() {
Doc.mEvList.clear();
//for(TTEvt ev : evArray)
// Doc.mEvList.add(ev);
try {
ByteArrayInputStream bais = new ByteArrayInputStream(undoBuf);
GZIPInputStream gzipIn;
gzipIn = new GZIPInputStream(bais);
ObjectInputStream objectIn = new ObjectInputStream(gzipIn);
while(objectIn.available()>0) {
TTEvt ev = (TTEvt) objectIn.readObject();
Doc.mEvList.add(ev);
}
objectIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
forceTotalRedraw();
}
これに伴う問題は、その速度が遅く、約5000エントリのデータ構造体の場合はほぼ1秒です。
これは現時点では1レベルの取り消しであり、現在、複数のレベルを維持するためにスタックを実装しており、メモリ圧縮でより高速なものを探しています